ipywidgets小部件的值不变

时间:2019-06-01 03:34:10

标签: python jupyter-notebook ipywidgets azure-notebooks

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

我尝试使用不同类型的小部件(TextTextareaCheckboxButtonToggleButton)输入不同的初始值。我尝试在按钮上使用w.valueipywidgets.interactw.observew.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字段中输入内容时,它将输出该文本,但是它将继续打印出其开头的内容。没有错误。因此,对于上面的示例,无论我在结果文本字段中输入什么内容,所有打印的内容都是空行。

2 个答案:

答案 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看到更改后的值。

enter image description here

在此处查看进一步的讨论(查找“异步”):

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

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