我想找到一种将小部件(在这种情况下为TextWidget)绑定到变量或函数的方法。 想法是,随着代码其他部分更改变量,该小部件会自动更新以显示该变量的内容。
到目前为止,这是我为保持小部件显示整数数组的内容所做的事情:
selected = list()
def list_recorded_points():
return ", ".join([str(i) for i in selected])
def record_point(i):
selected.append(i)
t.value = list_recorded_points()
import ipywidgets as widgets
t = widgets.Text(
value=list_recorded_points(),
placeholder='Type something',
description='String:',
disabled=False
)
t
我确实发现它很冗长,并且不得不调用record_point
而不是仅仅能够更改变量selected
使得它的可用性降低了。
答案 0 :(得分:0)
做到这一点的一种经典方法是使用已经在ipywidgets中大量使用的traittrait。
将解决方案添加到列表中时,此解决方案将不起作用,而只有在重新分配整个列表时,该解决方案才行。。这是因为traitlet仅管理分配时的事件,而不管理对象更改。如果性能在您的用例中不重要,则可以。
您将能够执行s.selected = s.selected + [5]
来更新文本,但是s.selected.append(5)
不会对其进行更新。
也就是说,这是怎么做:
您可以首先创建一个继承自traitlets.Hastraits
的类,并将您的selected
变量放在那里作为特征。
import traitlets as tl
class SelectedClass(tl.HasTraits):
selected = tl.List()
然后创建文本小部件和SelectedClass的实例:
import ipywidgets as widgets
t = widgets.Text(
value="",
placeholder='Type something',
description='String:',
disabled=False
)
s = SelectedClass()
最后,使用转换函数创建从变量到小部件值的定向链接。
def transform(selected_list):
return ", ".join([str(i) for i in selected_list])
tl.directional_link((s, "selected"), (t, "value"), transform=transform)