为什么我的ipywidget观察到在一个状态更改中多次被调用?

时间:2019-08-23 18:59:29

标签: python python-3.x widget jupyter ipywidgets

我在Jupyter笔记本中的一个单元格中使用一些单选按钮和一个滑块来编写一些代码。我有一个方法,只在更改选择后才想调用(对于单选按钮);并且仅在释放滑块时(对于滑块)。

但是,当单选按钮仅更改一次(我相信它会触发3次)时,使用“观察”方法会触发多次。当发生鼠标下移和鼠标上移时,将触发滑块观察方法。

可以将其更改为仅被调用一次,还是需要使用观察以外的方式?

[编辑]这是使用单选按钮和一次选择一个选项时输出的输出的更新示例:

import ipywidgets as widgets

    def radio_called(sender):
        print('radio_called')
        print(sender)

    radio = widgets.RadioButtons(options=['option 1', 'option2', 'option3'])
    radio.observe(radio_called)
    display(radio)

单击选项一次时的打印输出: radio_drawn

{'name': '_property_lock', 'old': traitlets.Undefined, 'new': {'index': 1}, 'owner': RadioButtons(options=('option 1', 'option2', 'option3'), value='option 1'), 'type': 'change'}
radio_called
{'name': 'label', 'old': 'option 1', 'new': 'option2', 'owner': RadioButtons(index=1, options=('option 1', 'option2', 'option3'), value='option 1'), 'type': 'change'}
radio_called
{'name': 'value', 'old': 'option 1', 'new': 'option2', 'owner': RadioButtons(index=1, options=('option 1', 'option2', 'option3'), value='option2'), 'type': 'change'}
radio_called
{'name': 'index', 'old': 0, 'new': 1, 'owner': RadioButtons(index=1, options=('option 1', 'option2', 'option3'), value='option2'), 'type': 'change'}
radio_called
{'name': '_property_lock', 'old': {'index': 1}, 'new': {}, 'owner': RadioButtons(index=1, options=('option 1', 'option2', 'option3'), value='option2'), 'type': 'change'}

1 个答案:

答案 0 :(得分:2)

如果打印sender对象,则可以看到传递给该函数的内容。每个实例都是一个不同的特质变化(单击时不只发生一个动作),请尝试下面的代码。

如果您希望仅过滤一次,请在observe调用中指定所需的名称。例如

radio_input.observe(bind_selected_to_output, names=['value'])

    import ipywidgets as widgets # If not already imported

    output_radio_selected = widgets.Text() # Used to take the user input and access it when needed
    radio_input = widgets.RadioButtons(options=['Option 1', 'Option 2']) # Declare the set of radio buttons and provide options

    def bind_selected_to_output(sender): # Connect the input from the user to the output so we can access it
        print(sender)
        global selected_option # Global variable to hold the user input for reuse in your code
        output_radio_selected.value = radio_input.value
        selected_option = output_radio_selected.value # Example variable assigned the selected value
        print('Selected option set to: ' + selected_option) # For test purposes

    radio_input.observe(bind_selected_to_output, names=['value']) # Run the bind... function when the radio button is changed
    radio_input # Display the radio buttons to the user

有关更多信息,请参见此处:https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Events.html#Traitlet-events