链接ipython小部件按钮和滑块值
作者:互联网
我试图弄清楚如何将由按钮小部件控制的计数器的值链接到滑块小部件的值.
这里的目标是使用ipython窗口小部件创建具有三个窗口小部件的简单“类似于vcr”界面:一个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的信息,但由于我的按钮小部件没有值,我看不到该怎么做-计数器对象具有我要链接的值.
这不起作用:
l = traitlets.link((counter, 'value'), (wpick, 'value'))
因为计数器不是HasTraits.
我如何才能将counter.value链接到wpick.value,以便单击按钮之一将调整滑块上的int?
解决方法:
按照this指南,您需要使用Counter类从DOMWidget类中插入,如下所示:
from traitlets import CInt, link
class Counter(widgets.DOMWidget):
value = CInt(0, sync=True)
然后,您可以定义计数器小部件和按钮回调方法:
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((wpick, 'value'), (counter, 'value'))
并在按钮上注册事件:
wplus.on_click(button_plus)
wminus.on_click(button_minus)
现在,单击按钮将增加/减少计数器的值.
标签:ipython-notebook,widget,python 来源: https://codeday.me/bug/20191027/1947946.html