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)
本质上,我正在使用 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)