首页 > 解决方案 > iPython / Jupyter 单元格何时可以使用小部件属性?

问题描述

我正准备创建一个用于 Jupyter 应用程序的通信小部件。我试图了解何时可以访问小部件的“值”属性......看起来“值”可以随时读取,但在单元格执行停止之前不会匹配小部件模型“值”(即,小部件的浏览器状态不会更新回小部件的内核状态)。

为了测试这一点,我尝试创建一个小的滑块小部件,等待 10 秒,然后读取小部件的“值”属性……都在同一个单元格中。在 10 秒内,用户(即我)有时间将滑块更改为“5”之类的东西。

这是一个可以在单元格中运行的小测试。当 sleep() 发生时,我将滑块移动到值“5”。

from ipywidgets import *
import time

slider = IntSlider(
    value=7,
    min=1,
    max=10.0,
    step=1,
    description="Input:",
)

display(slider)
time.sleep(10) # move slider to 5
print("done " + str(slider.value))

我预计“完成 5”,但得到“完成 7”,这意味着“值”仅在单元格完成后更新。

这总是正确的吗?有没有办法在小部件的浏览器状态和它在内核中的状态之间强制同步?

(如果我将 print() 移动到以下单元格,我会得到预期的“完成 5”。)

谢谢!

标签: jupyter-notebookwidgetipythonipywidgets

解决方案


目前基本上没有办法自动强制单元格中运行的代码等待事件或小部件中的更改。诸如此类的事情time.sleep(3)只会冻结单元格,并且在同一单元格中创建的滑块在睡眠完成之前不会显示。

用户可以在单元格 1 中创建一个滑块,然后在单元格 2 中执行睡眠,然后调整滑块,单元格 2 中的代码可能会在睡眠后看到变化,但在这种情况下,同步是由用户指导的,不是自动的.

您也可以从小部件事件启动 Python 代码,但 Python 代码不会“在单元格中运行”并且“打印”不会进入标准单元格输出区域,但可以通过其他方式捕获输出。

在以下屏幕截图中,我使用“输出”小部件来捕获小部件事件的输出

在此处输入图像描述

基本问题是小部件和内核之间的所有通信都是通过单向消息进行的——没有任何类型的“返回值”或“确认”。

有关更多讨论,请参阅https://github.com/AaronWatters/jp_proxy_widget/blob/master/notebooks/Tutorial.ipynb


推荐阅读