3

我正在尝试从运行 Python 3.6 中的 Jupyter Notebooks 的 Microsoft Azure Notebooks 中的 ipywidgets 小部件获取输出。但是,当我得到它们时它不会返回新值。这也适用于从不为其他小部件调用的事件处理程序/交互。

我尝试使用不同类型的小部件(Text, Textarea, Checkbox, Button, ToggleButton)输入不同的初始值。我已经尝试在按钮上获取w.valueipywidgets.interactw.observe和。w.on_click

我做的一个测试:

import time
import ipywidgets as widgets
from IPython.display import display

w = widgets.Text(disabled=False)
display(w)

while True:
    print(w.value)
    time.sleep(1)

我希望当我在该Text字段中输入内容时,它会输出该文本,但它会继续打印出它开始的内容。没有错误。因此,对于上面的示例,无论我在结果文本字段中输入什么,打印的都是空行。

4

2 回答 2

2

问题是小部件和 Python 内核之间的通信是异步且令人困惑的。

time.sleep(...)在单元格中只阻止 Python 解释器,并且不允许小部件 Javascript 实现将更改的值发送到 Python 内核(因为 Python 内核被阻止并且不做任何事情)。

如果您创建小部件,然后修改小部件文本条目,然后 以交互方式在下一个单元格w.value中进行评估,您将看到更改后的值。

在此处输入图像描述

请参阅此处的进一步讨论(查找“异步”):

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

通常,如果您想强制 Python 解释器查看从 Javascript 小部件实现发送的某些值,则 Javascript 端必须以某种方式回调 Python 解释器,并且 Python 解释器不能被睡眠或任何其他此类机制阻塞。

于 2019-06-05T13:36:26.783 回答
2

此代码在普通笔记本服务器中无法正常工作,因此在 Azure 中也可能无法正常工作。我怀疑您需要一个线程进程来从更新的小部件中读取。试试这个,看看在更改文本字段时是否在 Azure Notebooks 中打印任何内容。

    import time
    import ipywidgets as widgets
    from IPython.display import display

    w = widgets.Text(disabled=False)
    display(w)

    def print_text(widget):
        print(widget['new'])

    w.observe(print_text, names='value')
于 2019-06-03T08:59:24.417 回答