如何防止将第二个ipwidget更改为两次调用交互功能?

时间:2018-07-05 17:30:01

标签: python ipywidgets

每当第一个滑块发生变化时我更新第二个滑块时,函数f就会被调用两次

我理解为什么会这样,但是由于在计算我实际想要显示的内容时需要花费一些时间,因此会在输出中引起一些不必要的闪烁。

最小工作示例

import ipywidgets as widgets
ncalls =0
caption = widgets.Label(value='N Calls: ' + str(ncalls))
a = widgets.IntSlider(min=-5, max=5, value=1, description='a')
b = widgets.IntSlider(min=-5, max=5, value=1, description='b')

def handle_slider_change(change):
    b.value = change["new"] - change["old"] + b.value 

def f(a, b):
    global ncalls
    ncalls +=1
    caption.value = 'N Calls: ' + str(ncalls)
    print(a,b)

a.observe(handle_slider_change, names='value')
out = widgets.interactive_output(f, {"a":a, "b":b})
widgets.VBox([caption,a,b,out])

1 个答案:

答案 0 :(得分:0)

尽管您似乎在交互功能中拥有更昂贵的功能,但我没有看到太多的闪烁。您能描述一下想要要发生的事情吗?

与a.observe相比,也许widgets.link会有所帮助吗?

import ipywidgets as widgets
ncalls =0
caption = widgets.Label(value='N Calls: ' + str(ncalls))
a = widgets.IntSlider(min=-5, max=5, value=1, description='a')
b = widgets.IntSlider(min=-5, max=5, value=1, description='b')

def handle_slider_change(change):
    b.value = change["new"] - change["old"] + b.value 

def f(a, b):
    global ncalls
    ncalls +=1
    caption.value = 'N Calls: ' + str(ncalls)
    print(a,b)

widgets.link((a, 'value'), (b, 'value'))
out = widgets.interactive_output(f, {"a":a, "b":b})
widgets.VBox([caption,a,b,out])