在单元执行内接收小部件回调

时间:2019-06-13 11:55:08

标签: jupyter

在Jupyter单元执行期间,是否有任何方式允许小部件状态更新消息从javascript传递到python端?

我们正在使用一个DOMWidget来浸涂一个带有用于通过Http消息进行通信的API的网页。因此,我们设法发送命令并将响应返回到小部件的javascript端。问题在于,直到Jupyter单元完成执行后,才在python端收到小部件状态更新。我猜这是因为内核忙于单元执行,而接收函数放在了que上。

目前的解决方法是将响应从javascript端写入同步的特征,用户可以在随后的单元格中访问它。我们还显示一个输出小部件,其文本链接到另一个特质,以在收到响应时提供信息。这有点混乱,我希望对执行有更多控制,以等待后续的单元执行,直到收到响应或超时为止。

1 个答案:

答案 0 :(得分:0)

否,没有直接的方法可以使Jupyter代码单元等待小部件发送的事件或值。问题在于(Python)内核仅向(Javascript)小部件发送单向消息,并且没有办法让内核等待Javascript端的响应。

Python代码可以以各种方式拦截Javascript调用的回调,但是这些回调的结果将不会以通常的方式显示在单元格输出中。它们必须以内核状态存储或在小部件上下文中显示-例如,请参见输出标准小部件。

https://ipywidgets.readthedocs.io/en/stable/examples/Output%20Widget.html

您可以使用输出窗口小部件来显示从窗口小部件的Javascript实现发送的结果,但是输出显示在窗口小部件上下文中,而不是通常的单元格输出。

例如,如果用户执行“全部运行”,则以下策略将不起作用

  • 单元格1创建一个小部件,该小部件与用户进行交互并回调到 Python在文件系统中创建文件“ ./xxx.dat”。

  • 单元2进入无限轮询循环,等待“ ./xxx.dat”出现 在继续之前。

如果用户一次交互式地运行一个单元,则可能会起作用。 但是在Jupyter小部件的当前实现中,如果用户确实“全部运行” 必须先启动并完成“单元2”中的无限循环,然后才能完成“单元1”中的小部件 已创建,并且由于循环永远不会完成,因此将永远不会创建小部件 文件将永远不会出现,并且笔记本电脑将被冻结。

也请参阅jp_proxy_widget教程,以获取有关的更多讨论 Jupyter小部件的异步特性。

https://github.com/AaronWatters/jp_proxy_widget/blob/master/notebooks/Tutorial.ipynb