Jupyter ipython clear_output() 不再工作了

0 投票
2 回答
48 浏览
提问于 2025-04-13 21:25

我在使用 Jupyter 版本:7.1.2。

这个简单的例子不太好使:

import ipywidgets as widgets
from IPython.display import display, clear_output

def page_1():
    button = widgets.Button(description="Next")
    def next_button_clicked(b):
        clear_output(wait=True)
        page_2()
    button.on_click(next_button_clicked)
    display(button)

def page_2():
    text = widgets.HTML(value='<h2 style="text-align:center">HELLO</h2>')
    display(text)

page_1()

虽然页面 page_1 显示出来了,但当我点击“下一步”按钮时,什么也没发生。可以确认“next_button_clicked”这个函数确实被调用了,因为我有额外的打印信息(为了简洁,这里没有显示)。

这个例子之前是可以正常工作的,我怀疑问题是在 Jupyter 升级后出现的。

有没有人知道怎么回事?

2 个回答

0

感谢@Wayne,我找到了一种解决方法,这里有一个可以运行的简单示例:

import ipywidgets as widgets
from IPython.display import display, clear_output

out = widgets.Output()

def page_1():
    button = widgets.Button(description="Next")
    def next_button_clicked(b):
        with out:
            clear_output(wait=True)
        page_2()

    button.on_click(next_button_clicked)
    with out:
        display(button)

def page_2():
    text = widgets.HTML(value='<h2 style="text-align:center">HELLO</h2>')
    with out:
        display(text)

page_1()
out
1

在现代的Jupyter技术中,使用当前的ipywidgets时,你需要指定如何处理page_2()的内容放在哪里。
这里有一个基本的实现,尽量不改变你的代码:

import ipywidgets as widgets
from IPython.display import display, clear_output

out = widgets.Output()

def page_1():
    button = widgets.Button(description="Next")
    def next_button_clicked(b):
        clear_output(wait=True)
        page_2()
    button.on_click(next_button_clicked)
    display(button)

def page_2():
    with out:
        text = widgets.HTML(value='<h2 style="text-align:center">HELLO</h2>')
        display(text)


page_1()
out

这个代码已经在Jupyter Notebook 7.1中测试过,当你按下按钮时,页面2的HTML内容会按照指示显示在中间。
你会注意到我添加了out,并使用上下文管理器来将页面2的内容引导到它。

在Jupyter Notebook 7.1中运行你的代码时,我发现按下按钮没有任何反应。但是,在JupyterLab中运行你的代码时,点击“下一步”按钮后,我看到页面2的内容出现在日志控制台中。(你可以在临时的JupyterLab会话中尝试这个,而不需要在你的电脑上安装任何东西,点击这里启动一个会话,然后从启动面板打开一个新的笔记本。ipywidgets已经在那儿安装好了。)

这表明ipywidgets的输出没有被正确处理。你可以查看这里的一个例子另一个例子

由于在JupyterLab中使用ipywidgets时会得到额外的反馈,我建议你在排查ipywidgets问题时,可能更想在JupyterLab中工作。Jupyter Notebook是以文档为中心的,尽我所知,它并不显示日志控制台。

鉴于标题提到clear_output(),我原本打算添加处理涉及到这个的过渡效果;不过,在我能做到之前,提问者已经添加了一个很好的例子作为回答。如果你对clear_output()感兴趣,并想寻找更多相关代码,可以查看这里和相关的参考资料

撰写回答