【问题标题】:ipywidgets widgets values not changingipywidgets 小部件值不变
【发布时间】:2019-06-01 03:34:10
【问题描述】:

我正在尝试从运行 Python 3.6 中的 Jupyter Notebooks 的 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 字段中输入内容时,它会输出该文本,但它会继续打印出它开始的内容。没有错误。因此,对于上面的示例,无论我在结果文本字段中输入什么,打印的都是空行。

【问题讨论】:

    标签: python jupyter-notebook ipywidgets azure-notebooks


    【解决方案1】:

    此代码在普通笔记本服务器中无法正常工作,因此在 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')
    

    【讨论】:

    【解决方案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 解释器不能被睡眠或任何其他此类机制阻塞.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多