问题描述
我正在试验 Jupyter Widgets 以查看是否可以制作更好的 this 版本,但显然即使更改不是来自用户,观察处理程序也会触发,因此它创建了一个无限的一个小部件更改另一个小部件的循环。最小示例:
import ipywidgets as widgets
a = widgets.FloatText(description='a:')
b = widgets.FloatText(description='b:')
def on_a_change(change):
b.value = change['new'] + 1
a.observe(on_a_change,names='value')
def on_b_change(change):
a.value = change['new'] + 1
b.observe(on_b_change,names='value')
display(a)
display(b)
有没有办法只触发用户发起的更改?换句话说,用户更新一个文本框,然后其他文本框也随之更新,但这些更新不会触发更多更新。
解决方法
您也可以在更改值时unobserve
一个函数,然后再将其重置。
def on_a_change(change):
b.unobserve(on_b_change,names='value')
b.value = change['new'] + 1
b.observe(on_b_change,names='value')
,
不确定我是否理解要求,但如果是“多更新一个”,那么您可以尝试以下操作
import ipywidgets as widgets
a = widgets.FloatText(description='a:')
b = widgets.FloatText(description='b:')
def update_one(x):
return x + 1
widgets.link((a,'value'),(b,(update_one,update_one))
display(a)
display(b)
widgets.link
似乎可以解决问题,如果你执行 widgets.link.__doc__
你可以看到文档并且它接受第三个参数。
>>> print(widgets.link.__doc__)
Link traits from different objects together so they remain in sync.
Parameters
----------
source : (object / attribute name) pair
target : (object / attribute name) pair
transform: iterable with two callables (optional)
Data transformation between source and target and target and source.
所以我添加了一个可调用的可迭代对象,并使其返回的值比您输入的值多 1
。