Python progressbar模块进度条无法单行显示如何解决
问题原因
进度条没法在同一行刷新、每次更新都跳新行,主要是两个问题:
- 你写的更新逻辑有问题:
pbar.start()启动后进度默认是0,但你的循环从100才开始更新,直接跳过了0-99的进度段,最后还多写了一个没用的空print,逻辑本身就不对 - 运行环境不兼容:
progressbar库实现单行刷新的原理是输出\r回车符,把光标拉回当前行开头再覆盖写新内容。要是你在IDLE、老版本PyCharm控制台、不支持ANSI转义的老终端里跑脚本,\r会被识别成换行符,自然每更一次就多一行。
解决方案
方案1:改原有代码,在兼容终端运行
先把代码逻辑改对,换到支持回车刷新的终端(比如VSCode内置终端、Windows Terminal、Win10以上版本系统自带的CMD/PowerShell、Linux/macOS的bash/zsh)运行,就能正常单行显示:
import time from progressbar import * widgets = ['Test: ', Percentage(), ' ', Bar(marker='0',left='[',right=']'), ' ', ETA(), ' ', FileTransferSpeed()] pbar = ProgressBar(widgets=widgets, maxval=500) pbar.start() # 从0开始遍历,数值范围和maxval对应 for i in range(500 + 1): # 这里替换成你自己的耗时任务逻辑 time.sleep(0.01) pbar.update(i) pbar.finish()
注意:进度条跑的过程中别直接用print()打其他内容,不然会把当前行的进度条挤到新行去。
方案2:换用适配性更好的tqdm库
要是你需要在IDE自带控制台这类特殊环境跑脚本,更推荐用tqdm做进度条,它对各种环境的适配比老的progressbar库好很多,写法也更简单。
先装库:pip install tqdm
对应效果和你原来一致的代码:
import time from tqdm import tqdm for i in tqdm(range(501), desc='Test', bar_format='{desc}: {percentage:3.0f}% |{bar}| {remaining} {rate_fmt}'): # 替换成你自己的任务逻辑 time.sleep(0.01)
内容的提问来源于stack exchange,提问作者martinmistere
相关产品推荐
相关产品推荐

