如何在运行代码时更新 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 值?的主要内容,如果未能解决你的问题,请参考以下文章