链接ipython小部件按钮和滑块值 [英] Linking ipython widget button and slider values

查看:127
本文介绍了链接ipython小部件按钮和滑块值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图弄清楚如何将由按钮小部件控制的计数器的值链接到滑块小部件的值.

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 Buttons 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

链接slidercounter小部件:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆