3

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

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

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)

按下按钮时,请参阅图像以获取输出:

在此处输入图像描述

4

1 回答 1

1

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

{'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)
于 2021-01-12T09:04:21.793 回答