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