Сначала я немного изменил ваш код.Основные изменения: я добавил
- условие try-исключение в
Plot.dashboard()
с инструкциями печати для события и переменной self.multi_select
- , которое использует внешний сервер Bokeh с
view = pn.Row(a.multi_select,a.dashboard)
и view.app()
, чтобы получить распечатки из предложения try-исключением.
Полный график ():
class Plot(param.Parameterized):
def __init__(self, df, **params):
super(Plot, self).__init__(**params)
self.multi_select = pn.widgets.MultiSelect(name='Vars', value=['signal1'],
options=['signal1', 'signal2'])
self.df = df
self.watcher = self.multi_select.param.watch(self.dashboard, 'value')
def dashboard(self, *events, **kwargs):
try:
event = events[0] # get first event in events
select = events[0].obj # obj is our multi_select
# see, what event looks like, and if select and self.multi_select are the same
print(event, '\n', select, '\n', self.multi_select)
except IndexError: pass
self.plt = hv.Curve(self.df, [self.df.index.name, self.multi_select.value[0]])
return self.plt
a = Plot(df)
view = pn.Row(a.multi_select,a.dashboard)
view.app()
Таким образом, ваш код работает, как и следовало ожидать, но изменения не отображаются.
Второе: отделение графика кривой от множественного выбора и повторное отображение показывают, что кривая только изменяется,если метод view
зависит от измененного параметра (здесь имя столбца, используемого для графика):
class Curve_(param.Parameterized):
col = param.String()
def __init__(self, df, col, **params):
super(Curve_, self).__init__(**params)
self.df = df
self.col = col
@param.depends('col', watch=True)
def view(self):
return hv.Curve(self.df, [self.df.index.name, self.col])
t=Curve_(df, 'signal1')
pn.Column(t.view)
Объединение классов Plot
и Curve_
и использование параметра dashboard_trigger
чтобы держать приборную панель в актуальном состоянии, все теперь работает как положено.
class Plot(param.Parameterized):
dashboard_trigger = param.Number(1)
def __init__(self, df, **params):
super(Plot, self).__init__(**params)
self.multi_select = pn.widgets.MultiSelect(name='Vars', value=['signal1'],
options=['signal1', 'signal2'])
self.curve = Curve_(df, self.multi_select.value[0])
self.watcher = self.multi_select.param.watch(self.set_column, 'value')
def set_column(self, *events):
self.curve.col = events[0].obj.value[0]
self.dashboard_trigger = self.dashboard_trigger + 1
@param.depends('dashboard_trigger', watch=True)
def dashboard(self, *events, **kwargs):
return self.curve.view
a = Plot(df)
pn.Row(a.multi_select,a.dashboard)