使用Enlighten进度条时已完成进度条未消失的问题求助
解决Enlighten进度条完成后无法移除的问题
问题原因
你在循环中使用了普通的print()语句,这会向终端输出新行,打乱Enlighten对进度条光标位置的管理逻辑。当调用close()方法时,Enlighten无法定位到原来的进度条行,导致已完成的进度条无法被正确移除。
解决方案
方案一:使用Enlighten自带的输出方法(推荐)
Enlighten的Manager对象提供了output属性,通过它输出内容不会干扰进度条的位置管理,Enlighten会自动处理输出内容和进度条的显示位置。
修改后的完整代码:
import time import enlighten def run_first_loop(manager): ticks = manager.counter(total=100, desc='A - first bar', unit='ticks', leave=False) tocks = manager.counter(total=20, desc='A - second bar', unit='tocks', leave=False) for num in range(100): time.sleep(0.1) # 模拟工作负载 # 用manager.output.write替代print,避免干扰进度条 manager.output.write(f"{num}\n") ticks.update() if not num % 5: tocks.update() ticks.close() tocks.close() # 强制刷新管理器,确保进度条完全移除 manager.refresh() def run_sec_loop(manager): new_ticks = manager.counter(total=100, desc='B - first bar', unit='ticks', leave=False) for num in range(100): time.sleep(0.1) # 模拟工作负载 manager.output.write(f"{num}\n") new_ticks.update() new_ticks.close() manager = enlighten.get_manager() run_first_loop(manager) time.sleep(2) run_sec_loop(manager) manager.stop()
方案二:手动清除进度条行(兼容普通print场景)
如果必须使用普通print(),可以在第一个循环结束后,通过ANSI终端控制字符手动清除进度条所在的行:
在run_first_loop函数的末尾添加以下代码:
# 清除两个进度条对应的行 for _ in range(2): # ANSI控制字符:光标上移一行 + 清除当前行 manager.output.write("\033[A\033[K") manager.output.flush()
注意:该方法依赖终端对ANSI控制字符的支持,兼容性不如方案一。
效果验证
使用方案一修改后,run_first_loop执行完成并调用close()和refresh()后,A系列的进度条会从屏幕上完全移除,运行run_sec_loop时屏幕上只会显示B系列的进度条。
内容的提问来源于stack exchange,提问作者Salah
相关产品推荐
相关产品推荐

