Как использовать кнопку переключения с обратным вызовом (в классе) в PyViz?

#python #widget #pyviz

#python #виджет #pyviz

Вопрос:

Я использую PyViz / Panel в записной книжке. Теперь я хочу использовать кнопку переключения внутри класса и привязать к ней обратный вызов.

Этот код — вне класса — работает:

 import panel as pn
import panel.widgets as pnw
pn.extension()

toggle = pn.widgets.Toggle(name='Toggle')

def callback(*events):
    if toggle.active is True: toggle.name = 'Active'
    else: toggle.name = 'Toggle'

watcher = toggle.param.watch(callback, 'active')
toggle.param.set_param(active=False)
toggle.param.trigger('active')

pn.Row(toggle)
  

Он создает кнопку переключения, и при нажатии текст меняется.

Нет, я пытался поместить все в определение класса:

 class ToggleInClass():
    def __init__(self):
        self.toggle = pn.widgets.Toggle(name='Toggle')
        self.watcher = self.toggle.param.watch(callback, 'active')
        self.toggle.param.set_param(active=False)
        self.toggle.param.trigger('active')

    def callback(self, *events):
        if toggle.active is True: toggle.name = 'Active'
        else: toggle.name = 'Toggle'

toggle_in_class = ToggleInClass()
pn.Row(toggle_in_class.toggle)
  

Снова создается кнопка, но на этот раз обратный вызов, похоже, не работает: текст никогда не меняется.

Кажется, наблюдатель в порядке: toggle_in_class.watcher выдает Watcher(inst=Toggle(), cls=<class 'panel.widgets.Toggle'>, fn=<function callback at 0x000001EC8419E510>, mode='args', onlychanged=True, parameter_names=('active',)) .

Вывод toggle_in_class.toggle.active чередуется в зависимости от состояния переключения.

Что не так с моим определением обратного вызова / класса?

Ответ №1:

После исправления некоторых глупых опечаток этот код работает у меня:

 class ToggleInClass():

    def __init__(self):
        self.toggle = pn.widgets.Toggle(name='Toggle')
        self.watcher = self.toggle.param.watch(self.callback, 'active')
        self.toggle.param.set_param(active=False)

    def callback(self, *events):
        if self.toggle.active is True: self.toggle.name = 'Active'
        else: self.toggle.name = 'Toggle'

toggle_in_class = ToggleInClass()
pn.Row(toggle_in_class.toggle)