使用线程定期更新的 Ipywidget

Ipywidget with periodic update using thread

我正在尝试定期记录滑块小部件的值。我在Asynchronous Widgets上查看了官方文档。但是对于我的代码,似乎仍然会发生阻塞。

import threading
import time
from ipywidgets import widgets

w = widgets.IntSlider()
out = widgets.Output()
def record():
   for i in range(10):
       time.sleep(1)
       with out:
           print(f"record {w.value}")
           
t = threading.Thread(target=record)

display(w,out)
t.start()
t.join()

我希望在拖动滑块时每秒输出滑块值。相反,它在拖动过程中只打印 0。

我也试过将两个进程都放在线程中(并使用滑块的观察方法),但效果不佳。

环境:Jupyter 实验室 3.2.1

问题来自于在代码末尾调用 join 函数。在您的线程上调用 join 会阻止您的小部件更新。我还会将您的小部件 w 和您的输出 out 作为参数传递给您的 `record 函数(如 here 中)。总的来说,代码如下所示:

import threading
import time
from ipywidgets import widgets

w = widgets.IntSlider()
out = widgets.Output()
def record(w,out):
   for i in range(10):
       time.sleep(1)
       with out:
           print(f"record {w.value}")
           
t = threading.Thread(target=record,args=(w,out,))

display(w,out)
t.start()

下面是一个输出示例:

record 0
record 30
record 30
record 50
record 72
record 97
record 80
record 80
record 35
record 35