You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tqdm多进度条使用问题:如何保留已完成进度条的完整样式?

解决tqdm多进度条完成后消失的问题

你遇到的问题根源在于tqdm的leave参数设置:默认leave=None时,只有position=0的进度条会在完成后保留,其他位置的进度条会被自动清除。要让已完成的进度条保持实心满条状态,只需要调整这个参数:

修改方案

在创建进度条时,将leave=None改为leave=True,强制所有进度条完成后保留在终端中。同时可以在任务完成后手动刷新进度条,确保状态正确更新。

修改后的完整代码

from tqdm import tqdm
import time
import concurrent.futures

bars = []
# 核心修改:将leave=None改为leave=True
for i in range(3):
    bars.append(tqdm(total=1024, unit="B", unit_scale=True, leave=True, unit_divisor=1024, ncols=100, position=i))

def upload_chunk(chunk_no):
    bar = bars[chunk_no % 3]

    if chunk_no == 0:
        size = 1024*1024*10
    else:
        size = 1024*1024*5
    if bar:
        bar.desc = f'chunk {chunk_no + 1}/{3}'
        bar.reset(total=size)
    def gen():
        offset = 0
        while True:
            if offset < size:
                update_chunk = 1024*200
                time.sleep(0.1)
                yield 'something'
                offset += update_chunk
                if bar:
                    bar.update(update_chunk)
            else:
                # 完成后刷新进度条,确保状态正确显示
                if bar:
                    bar.refresh()
                break
    result = list(gen())
    return result

with concurrent.futures.ThreadPoolExecutor(max_workers=3) as ex:
    for i in range(0, 3):
        ex.submit(upload_chunk, i)

for bar in bars:
    bar.close()

print('Done!')

关键说明

  • leave=True:这个参数会让所有位置的进度条在任务完成后保留,不会被终端清除,最终显示为100%的实心满条。
  • bar.refresh():在任务循环结束后调用,确保进度条的最终状态立即更新到终端,避免因线程调度导致的显示延迟。
  • 你的线程池逻辑无需改动,每个线程对应独立的进度条位置,不会出现互相覆盖的问题。

运行修改后的代码,所有完成的进度条都会保持完整的满条状态,直到所有任务结束后才会打印Done!。

内容的提问来源于stack exchange,提问作者fireattack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:16:28