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
相关产品推荐
相关产品推荐

