我在理解IPython update
上display
的功能时遇到麻烦。
似乎要更新,该窗口小部件需要在顶级实例化,而不能从ipywidget的回调中实例化。
这是由ipywidget display
调用的IPython Button
的无效示例:
import functools
import ipywidgets as widgets
from IPython.display import display
import random
def foo(b):
label = display('Initial text', display_id = True)
def on_button_click(b, label):
label.update('New number {}'.format(random.random()))
button = widgets.Button(description="New number")
display(button)
button.on_click(functools.partial(on_button_click, label=label))
button = widgets.Button(description="Button")
button.on_click(foo)
display(button)
在此示例中,单击“按钮”将显示文本
label
和一个新按钮(“新编号”)。但是,单击“新号码”不会更新文本
label
。直接调用
foo(0)
可以正常工作。单击“新数字”按钮时,文本label
将更新。代码示例有问题吗?如果从另一个窗口小部件的回调实例化了一个ipywidget,为什么不能对其进行更新?
最佳答案
我之前已经看过这个问题,可能是由于使用display
时将输出路由到何处所致。通过使用上下文管理器Output小部件包装您的函数,可以得到所需的行为。
对于更复杂的事情,我会考虑构建一个从HBox派生的类,其中包含一个Output小部件和各种按钮。
import functools
import ipywidgets as widgets
from IPython.display import display
import random
out = widgets.Output()
def foo(b):
with out:
label = display('Initial text', display_id = True)
def on_button_click(b, label):
label.update('New number {}'.format(random.random()))
button = widgets.Button(description="New number")
display(button)
button.on_click(functools.partial(on_button_click, label=label))
button = widgets.Button(description="Button")
button.on_click(foo)
display(button)
display(out)