ipywidgets 下拉点击

ipywidgets dropdown onclick

下拉小部件似乎没有 on_click 选项,我想知道是否有某种解决方法。我想到的一种方法是,每次选择一个选项时,刷新选项并再次从顶部开始下拉菜单,其中顶部选项将为空 "".

例如假设我有:

from IPython.html import widgets
from IPython.display import display

def dropdown_event_handler(change):
    print(change.new)
    # flush the options and start from "" again

options = ["", "A", "B"]
dropdown = widgets.Dropdown(options=options, description="Categories")
dropdown.observe(dropdown_event_handler, names="value")
display(dropdown)

所以期望的行为是,如果我再次按下“A”和“A”,A 将被打印两次。

正如您已经建议的那样,您可以在每次更改后将小部件的值设置为 ""

from IPython.html import widgets
from IPython.display import display

def dropdown_event_handler(change):
    print(change.new)
    dropdown.value = ""       

options = ["", "A", "B"]
dropdown = widgets.Dropdown(options=options, description="Categories")
dropdown.observe(dropdown_event_handler, names='value')

display(dropdown)

恐怕这是您唯一的选择。 Dropdown 小部件除了“更改”之外没有其他类型。您可以通过使用 type=All.

打印它们来查看所有可用类型
from IPython.html import widgets
from IPython.display import display
from traitlets import All

def dropdown_event_handler(change):
    print(change)    

options = ["", "A", "B"]
dropdown = widgets.Dropdown(options=options, description="Categories")
dropdown.observe(dropdown_event_handler, type=All)

display(dropdown)

输出:

{'name': '_property_lock', 'old': traitlets.Undefined, 'new': {'index': 1}, 'owner': Dropdown(description='Categories', options=('', 'A', 'B'), value=''), 'type': 'change'}
{'name': 'label', 'old': '', 'new': 'A', 'owner': Dropdown(description='Categories', index=1, options=('', 'A', 'B'), value=''), 'type': 'change'}
{'name': 'value', 'old': '', 'new': 'A', 'owner': Dropdown(description='Categories', index=1, options=('', 'A', 'B'), value='A'), 'type': 'change'}
{'name': 'index', 'old': 0, 'new': 1, 'owner': Dropdown(description='Categories', index=1, options=('', 'A', 'B'), value='A'), 'type': 'change'}
{'name': '_property_lock', 'old': {'index': 1}, 'new': {}, 'owner': Dropdown(description='Categories', index=1, options=('', 'A', 'B'), value='A'), 'type': 'change'}

因此,如果 Dropdown 小部件中的值没有发生变化,您将无法观察到它。有关详细信息,请参阅 Traitlets documentation.