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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:10:11