Jupyter ipython clear_output() 不再工作了
我在使用 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 个回答
感谢@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
在现代的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()
感兴趣,并想寻找更多相关代码,可以查看这里和相关的参考资料。