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()