从内部线程清除ipywidget输出

时间:2020-08-08 18:55:20

标签: python ipython ipywidgets

我正在尝试从线程内部清除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

1 个答案:

答案 0 :(得分:1)

根据docs,看来您正在使用正确的呼叫。

避免意外的最好方法是在多个线程生成输出的上下文中永远不要使用输出小部件的上下文管理器。

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

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