Declaring new widgets with param.Parameterized and use decorators

I don’t it’s good practice to define widgets like you would define params (or at least it’s not supported at the moment Parameterized objects (e.g. Panel Widgets) as class attributes · Issue #832 · holoviz/param · GitHub)

Instead, you can define params like this:

import panel as pn
import param

pn.extension()


class MyWidget(param.Parameterized):

    button_event = param.Event()
    value = param.Integer(default=0)

    def __init__(self, **params):
        super().__init__(**params)
        self.button = pn.widgets.Button.from_param(self.param.button_event)
        self.value_pane = pn.widgets.IntInput.from_param(self.param.value)

    @param.depends("button_event", watch=True)
    def update_value(self):
        self.value += 1

    def view(self):
        return pn.Row(self.button, self.value_pane)


class BigApp(param.Parameterized):

    custom_widget = param.ClassSelector(class_=MyWidget, default=MyWidget())

    @param.depends("custom_widget.value", watch=True)
    def print_value(self):
        print("value has changed in the custom widget")

    def view(self):
        return pn.Row(self.custom_widget.view())


BigApp(custom_widget=MyWidget(value=3)).view()

1 Like