链接ipython小部件按钮和滑块值 [英] Linking ipython widget button and slider values
问题描述
我试图弄清楚如何将由按钮小部件控制的计数器的值链接到滑块小部件的值.
I'm trying to figure out how to link the value of a counter controlled by button widgets to the value of a slider widget.
这里的目标是使用ipython小部件创建具有三个小部件的简单类似于vcr的"界面:IntSlider
和两个Button
,它们增加一个计数器并减少一个计数器.这就是我所拥有的:
The goal here is use ipython widgets to create a simple "vcr-like" interface with three widgets: an IntSlider
and two Button
s that increment a counter and decrement a counter. This is what I've got:
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,并单击了增量按钮两次:
and here's a screen grab where I've moved the IntSlider to 1 and clicked twice on the increment button:
我显然希望有一个整数值受所有3个小部件的控制并与之同步.
I'd obviously like there to be a single integer value being controlled by and be in sync with all 3 widgets.
我了解了小工具链接,但我因为我的按钮小部件没有值,所以看不到该怎么做-计数器对象具有我要链接的值.
I read about widget linking but I don't see how to do this since my button widgets don't have a value -- the counter object has the value I want to link.
这不起作用:
l = traitlets.link((counter, 'value'), (wpick, 'value'))
因为counter
不是HasTraits
.
如何将counter.value
链接到wpick.value
,以便单击按钮之一可以调整滑块上的int?
How can I get counter.value
to be linked to wpick.value
so that clicking on one of the buttons will adjust the int on the slider?
推荐答案
Following this guide, you need the Counter
class to inheret from the DOMWidget
class like this:
from traitlets import CInt, link
class Counter(widgets.DOMWidget):
value = CInt(0, sync=True)
然后,您可以定义counter
小部件和按钮回调方法:
You can then define your counter
widget and button callback methods:
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
链接slider
和counter
小部件:
link((wpick, 'value'), (counter, 'value'))
并在按钮上注册事件:
wplus.on_click(button_plus)
wminus.on_click(button_minus)
现在单击按钮将增加/减少计数器的值.
Clicking the buttons will now in/decrease the value of the counter.
这篇关于链接ipython小部件按钮和滑块值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!