链接 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 slider
和 counter
小部件:
link((wpick, 'value'), (counter, 'value'))
并在按钮上注册事件:
wplus.on_click(button_plus)
wminus.on_click(button_minus)
点击按钮现在 in/decrease 计数器的值。
我想弄清楚如何 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 slider
和 counter
小部件:
link((wpick, 'value'), (counter, 'value'))
并在按钮上注册事件:
wplus.on_click(button_plus)
wminus.on_click(button_minus)
点击按钮现在 in/decrease 计数器的值。