如何强制两个 jupyter 滑块相互交互(不平凡)?"tag"可用于处理程序吗?



我想创建两个 ipywidget 滑块,比如一个值为 x,另一个值为 1-x。当我更改一个滑块时,另一个滑块应该相应地自动更改。我正在尝试使用观察进行回调。我看到我可能会使用所有者和描述来识别修改了哪个滑块。但我不认为描述应该用于这个目的。毕竟,描述首先不应该是唯一的。我想知道我是否在这里错过了什么。

from ipywidgets import widgets
x=0.5
a=widgets.FloatSlider(min=0,max=1,description='a',value=x)
b=widgets.FloatSlider(min=0,max=1,description='b',value=1-x)
display(a,b)
def on_value_change(change):
if str(change['owner']).split("'")[1]=='a':
exec('b.value='+str(1-change['new']))
else:
exec('a.value='+str(1-change['new']))
a.observe(on_value_change,names='value')
b.observe(on_value_change,names='value')

带有小部件的初学者,但我之前遇到了同样的问题,找不到解决方案。我拼凑了几个来源,想出了一些似乎有效的东西。

下面是两个滑块根据"100 = a + b">保持比例的模型示例,其中两个滑块代表ab

caption = widgets.Label(value='If 100 = a + b :')
a, b = widgets.FloatSlider(description='a (=100-b)'),
widgets.FloatSlider(description='b (= 100-a)')
def my_func1(a):
# b as function of a
return (100 - a)
def my_func2(b):
# a as function of b
return (100 - b)
l1 = widgets.dlink((a, 'value'), (b, 'value'),transform=my_func1)
l2 = widgets.dlink((b, 'value'), (a, 'value'),transform=my_func2)
display(caption, a, b)

解释一下,据我所知...关键是设置一个方向链接,用于两个滑块之间的每个方向,并为跨滑块的每个方向的数学运算提供一个变换函数。 即:

l1 = widgets.dlink((a, 'value'), (b, 'value'),transform=my_func1)

这句话的意思是:.dlink((a, 'value'), (b, 'value'),transform=my_func1)就像">a的值是用于确定b(输出(值的变量(输入(",并且"描述b的函数,作为a的函数,是my_func1"。 使用描述的链接,您只需要定义上述功能。 与直接链路l1相关的功能是:

def my_func1(a):          # defining b as function of a
return (100 - a)

同样(但相反(,l2l1的"反之亦然",my_func2my_func1的"反之亦然"。

我发现这更适合学习目的,与利用侦听器(a.observeb.observe(将有关滑块状态的详细信息(例如值(记录到字典类型参数(change(中相比,这可以更好地用于学习目的,该参数可以传递到转换函数和变量赋值的索引中。

祝你好运,希望对您有所帮助!更多信息请访问 https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Events.html#Linking-Widgets

最新更新