ipywidgets下拉小部件:onchange事件是什么?

Tim*_*son 13 ipython ipython-notebook

我可以在ipython notebook小部件中向button.on_click注册一个处理程序,但我不知道如何为下拉小部件执行相同操作

import ipywidgets as widgets
from IPython.display import display

def on_button_clicked(b):
    print("Button clicked.")

button = widgets.Button(description="Click Me!")
display(button)

button.on_click(on_button_clicked)
Run Code Online (Sandbox Code Playgroud)

但对于

choose_task = widgets.Dropdown(
    options=['Addition', 'Multiplication', 'Subtraction'],
    value='Addition',
    description='Task:',
)
Run Code Online (Sandbox Code Playgroud)

似乎只有

on_trait_change(...)
Run Code Online (Sandbox Code Playgroud)

如果我用这个注册处理程序,我可以用它来访问小部件的值吗?我看过处理程序的例子,小部件属于一个子类,处理程序可以使用self来内省.但是如果我不想使用子类,那么处理程序如何知道哪个小部件是事件的目标.

sfj*_*jac 29

这个链接github上的traitlet文档之间,只是在玩游戏,我终于弄明白了:

w = widgets.Dropdown(
    options=['Addition', 'Multiplication', 'Subtraction'],
    value='Addition',
    description='Task:',
)

def on_change(change):
    if change['type'] == 'change' and change['name'] == 'value':
        print "changed to %s" % change['new']

w.observe(on_change)

display(w)
Run Code Online (Sandbox Code Playgroud)

总体而言,这看起来比不赞成使用的界面更丰富,但它绝对可以使用更多示例.

  • 如果我们想将参数传递给 on_change 函数,知道该怎么做吗? (2认同)
  • @fabiob使用`functools.partial`:https://github.com/jupyter-widgets/ipywidgets/issues/2103#issuecomment-545716743 (2认同)

End*_*oth 6

您可以在 中指定更改名称observe。这使得代码更清晰,并且不会为您不需要的更改调用处理程序:

from IPython.display import display
from ipywidgets import Dropdown

def dropdown_eventhandler(change):
    print(change.new)

option_list = (1, 2, 3)
dropdown = Dropdown(description="Choose one:", options=option_list)
dropdown.observe(dropdown_eventhandler, names='value')
display(dropdown)
Run Code Online (Sandbox Code Playgroud)


Tho*_*gdt 5

把它们放在一起

受到以前的答案和 lambda 表达式的启发,我使用了这个:

def function(option):
    print(option)


w = widgets.Dropdown(
    options=['None', 'Option 1', 'Option 2', 'Option 3'],
    description='Option:',
    disabled=False
)

w.observe(
    lambda c: plot_content(c['new']) if (c['type'] == 'change' and c['name'] == 'value') else None
)

display(w)
Run Code Online (Sandbox Code Playgroud)