清除内部线程的 ipywidget 输出

Clear ipywidget output from inside thread

我正在尝试清除线程内部的 ipwidget 输出

比如我想做一个计数到10的计数器,在一个线程中运行,只显示当前的数字。

代码

import ipywidgets as widgets
import time
from IPython.display import display, HTML
from concurrent.futures import ThreadPoolExecutor

output = widgets.Output()
display(output)

def my_foo():
    for count in range(10):
        output.clear_output(wait=True)
        output.append_display_data(HTML(f"count {count}"))
        time.sleep(1)
        
with ThreadPoolExecutor() as executor:
    executor.submit(my_foo)

期望的输出

以上代码的最终输出应该是

count 9

实际输出

count 0
count 1
count 2
count 3
count 4
count 5
count 6
count 7
count 8
count 9

根据 docs,您似乎使用了正确的调用。

The best way to avoid surprises is to never use an output widget’s context manager in a context where multiple threads generate output.

但是,我在后台线程中遇到了同样的问题。我确实手动将输出设置为一个似乎有效的空列表(尽管我不确定它是否与 ipywidgets 跟踪更新的内部状态相混淆):

output.outputs = []  # instead of output.clear_output()