Python:从 ipywidgets.observe() 获取单个信号而不是 3 个

Python: Get single signal from ipywidgets.observe() rather than 3

本质上,我正在使用 ipywidgets 创建一些切换按钮。单击按钮后,我想将一个元素添加到列表中。如果未单击该按钮,则该元素将被删除。 (我还没有开始行动)

对于切换按钮,我使用 .observe() 并发现每次按下按钮时,我都会 returned 3 个信号。 {False, True, True} 如果单击,{True, False, False} 如果未单击。我认为每次单击按钮时 .observe() 是 运行 3 次。有什么方法可以 return 只有一个信号还是我的代码有错误?

import ipywidgets as widgets
import numpy as np
test = np.array(['test1','test2'])
def buttonArray(button_list):
    switch = [widgets.ToggleButton(description = name, value = False) for name in button_list]
    combined = widgets.HBox(switch)
    display(combined)    

    def upon_clicked(btn):
        signal = btn.owner.value
        print(signal)

    for n in range(len(button_list)):
        switch[n].observe(upon_clicked)

buttonArray(test)

按下按钮时查看输出图像:

如果您在观察到的函数中 print(btn),您将看到该函数被 运行 三次。您没有得到三个值的数组,它是一个函数,它产生一个值 运行 三次:

{'name': '_property_lock', 'old': traitlets.Undefined, 'new': {'value': True}, 'owner': ToggleButton(value=False, description='test1'), 'type': 'change'}

{'name': 'value', 'old': False, 'new': True, 'owner': ToggleButton(value=True, description='test1'), 'type': 'change'}

{'name': '_property_lock', 'old': {'value': True}, 'new': {}, 'owner': ToggleButton(value=True, description='test1'), 'type': 'change'}

_property_lock 属性被更改了两次,value 属性在中间更改了一次,因此调用了三个函数。

在大多数情况下,您可能只需要中间集数据。为此,您需要声明传递给观察函数的 name 值,在本例中为 names=['value']:

import ipywidgets as widgets
import numpy as np
test = np.array(['test1','test2'])
def buttonArray(button_list):
    switch = [widgets.ToggleButton(description = name, value = False) for name in button_list]
    combined = widgets.HBox(switch)
    display(combined)    

    def upon_clicked(btn):
        print(btn)
        signal = btn.owner.value
#         print(signal)

    for n in range(len(button_list)):
        switch[n].observe(upon_clicked, names=['value'])  # CHANGED HERE

buttonArray(test)