链接 ipython 小部件按钮和滑块值

Linking ipython widget button and slider values

我想弄清楚如何 link 由按钮小部件控制的计数器的值到滑块小部件的值。

这里的目标是使用 ipython 小部件来创建一个简单的 "vcr-like" 界面,其中包含三个小部件:一个 IntSlider 和两个 Button 递增和递减计数器一个柜台。这就是我得到的:

import ipywidgets as widgets
from functools import partial
from IPython.display import display
import traitlets

class Counter:
   def __init__(self, initial=0):
      self.value = initial

   def increment(self, amount=1):
      self.value += amount
      return self.value

def button_plus(counter, w):
    counter.increment(+1)  

def button_minus(counter, w):
    counter.increment(-1) 

counter = Counter()
# 1 step forward button
wplus = widgets.Button(description='>')
wplus.on_click(partial(button_plus, counter))
# 1 step backward button
wminus = widgets.Button(description='<')
wminus.on_click(partial(button_minus, counter))
# integer slider
wpick = widgets.IntSlider(value=0,min=0,max=10,step=1,description="time step")

display(wminus, wpick, wplus)

print(counter.value)
print(wpick.value)

这是我将 IntSlider 移至 1 并在递增按钮上单击两次的屏幕截图:

我显然希望有一个整数值由所有 3 个小部件控制并与其同步。

我阅读了有关 widget linking 的内容,但我不知道如何执行此操作,因为我的按钮小部件没有值 -- 计数器对象具有我想要的值 link。

这不起作用:

l = traitlets.link((counter, 'value'), (wpick, 'value'))

因为 counter 不是 HasTraits

如何将 counter.value link 编辑为 wpick.value,以便单击其中一个按钮可以调整滑块上的整数?

按照 this 指南,您需要 Counter class 像这样从 DOMWidget class 继承:

from traitlets import CInt, link
class Counter(widgets.DOMWidget):
    value = CInt(0, sync=True)

然后您可以定义 counter 小部件和按钮回调方法:

counter = Counter()
def button_plus(name):
    counter.value += 1 if counter.value < 10 else 0
def button_minus(name):
    counter.value -= 1 if counter.value > 0 else 0

link slidercounter 小部件:

link((wpick, 'value'), (counter, 'value'))

并在按钮上注册事件:

wplus.on_click(button_plus)
wminus.on_click(button_minus)

点击按钮现在 in/decrease 计数器的值。