我在理解IPython updatedisplay的功能时遇到麻烦。

似乎要更新,该窗口小部件需要在顶级实例化,而不能从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)


python - 如何更新从ipywidget的回调调用的ipywidget?-LMLPHP

在此示例中,单击“按钮”将显示文本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)

08-25 05:23