有没有一种方法可以将窗口小部件绑定到变量,以便在更改变量时窗口小部件更新?

时间:2019-11-19 06:20:20

标签: jupyter-notebook jupyter-lab ipywidgets

我想找到一种将小部件(在这种情况下为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使得它的可用性降低了。

1 个答案:

答案 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)