【问题标题】:Clear ipywidget output from inside thread从内部线程清除 ipywidget 输出
【发布时间】:2020-08-08 18:55:20
【问题描述】:

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

【问题讨论】:

  • 这似乎是由于Output.append_display_dataOutput.clear_output 的问题。 append_display_data 函数在 ipywidgets 线程文档中使用,但似乎不适用于 clear_output。只需忽略使用append_display_data 的建议即可修复它...
  • 我错了,不使用 append_display_data 意味着在使用多个线程和多个输出时会中断

标签: python ipython ipywidgets


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多