如何在运行代码时更新 ipywidget 值?

Posted

技术标签:

【中文标题】如何在运行代码时更新 ipywidget 值?【英文标题】:How do I update ipywidget values while running code? 【发布时间】:2022-01-21 11:20:47 【问题描述】:

所以我想在 Jupyter notebook 中创建一个简单的 UI:

    计数器“数字”每秒递增一次 如果选中“暂停”复选框,则“数字”不会增加 如果按下“触发器”按钮,则“数字”会递减,无论暂停状态如何

到目前为止,我尝试了以下代码的一些变体,但它不起作用;运行 while 循环时,小部件值似乎没有更新。有没有办法解决它或另一种方法来做到这一点?谢谢!

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

btn = widgets.Button(description = "Trigger")
pause = widgets.Checkbox(value = False, description = "Paused?")
number = widgets.Label("0")
wid = widgets.VBox([btn, number, pause])
display(wid)

def triggered(b):
    number.value = str(int(number.value) - 1)

btn.on_click(triggered)

while True:
    time.sleep(1)
    while (pause.value == True):
        time.sleep(3)
    number.value = str(int(number.value) + 1)

【问题讨论】:

是的,while 循环阻止了任何进入内核的消息。查看主文档中的异步小部件示例:ipywidgets.readthedocs.io/en/latest/examples/… 【参考方案1】:

正如 ac24 所述,诀窍是在不同的线程中运行您的计数器函数。您可以使用threading 库来执行此操作。下面,我定义了一个函数counter 并在不同的线程中启动它。这样,当counter 函数运行时,用户仍然能够与小部件进行交互。 要记住的重要一点是,一旦你启动了你的线程,就没有很多优雅的方法可以杀死它。这意味着最好设置一个total_duration 变量而不是使用while True

见下面的代码:

import ipywidgets as widgets
import time
from IPython.display import display, clear_output
import threading

btn = widgets.Button(description = "Trigger")
pause = widgets.Checkbox(value = False, description = "Paused?")
number = widgets.Label("0")

wid = widgets.VBox([btn,number,pause])
display(wid)

def triggered(b):
    number.value = str(int(number.value) - 1)
    
btn.on_click(triggered)
    
def counter(number,pause,total_duration):
    for t in range(total_duration):
        if not pause.value:
            time.sleep(1)
            number.value = str(int(number.value) + 1)
        elif pause.value:
            time.sleep(3)
            
total_duration=60          
thread = threading.Thread(target=counter, args=(number,pause,total_duration,))
thread.start()

【讨论】:

以上是关于如何在运行代码时更新 ipywidget 值?的主要内容,如果未能解决你的问题,请参考以下文章

Jupyter Ipywidgets 在显示和刷新时行为不一致

如何从 ipywidgets 输出返回熊猫数据框

ipywidgets:如何在两列中组织滑块

使用线程定期更新的 Ipywidget

如何在方法运行时更新值 - Java

如何让 ipywidgets 在 Jupyter Lab 中工作?