我正在尝试从在Python 3.6中运行Jupyter Notebook的Microsoft Azure Notebooks中的ipywidgets小部件获取输出。但是,当我获得它们时,它不会返回新值。这也适用于从未被其他小部件调用的事件处理程序/交互。
我尝试使用不同类型的小部件(Text
,Textarea
,Checkbox
,Button
,ToggleButton
)输入不同的初始值。我尝试在按钮上使用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
字段中输入内容时,它将输出该文本,但是它将继续打印出其开头的内容。没有错误。因此,对于上面的示例,无论我在结果文本字段中输入什么内容,所有打印的内容都是空行。
答案 0 :(得分:1)
此代码无法在普通笔记本服务器中正常运行,因此也可能无法在Azure中运行。我怀疑您需要一个线程过程来读取更新的窗口小部件。尝试此操作,看看更改文本字段时在Azure笔记本中是否可以打印任何内容。
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')
答案 1 :(得分:1)
问题是小部件和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解释器不能被睡眠或任何其他此类机制阻止