我正在尝试从在 Python 3.6 中运行 Jupyter Notebooks 的 Microsoft Azure Notebooks 中的 ipywidgets 小部件获取输出。但是,当我得到它们时,它不会返回新值。这也适用于永远不会为其他小部件调用的事件处理程序/交互。
我尝试使用不同类型的小部件(Text
、Textarea
、Checkbox
、Button
,切换按钮
)。我已尝试获取 w.value
、ipywidgets.interact
、w.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
字段中输入内容时,它会输出该文本,但它会继续打印它开始的内容。没有错误。因此,对于上面的示例,无论我在结果文本字段中输入什么,打印的都是空行。
最佳答案
问题是小部件和 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 解释器不能被 sleep 或任何其他此类机制阻塞.
关于python - ipywidgets 小部件值没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56403663/