Python如何实现类似TQDM仅清除上方单行而非整清控制台的功能
实现方案
核心基于ANSI转义序列实现单/多行内容定向清除,无需依赖任何第三方库,兼容绝大多数主流终端环境。
用到的核心控制指令:
\r:光标移动到当前行首\033[nA:光标向上移动n行\033[K:清除光标所在位置到行尾的内容
执行逻辑
- 程序启动后先打印顶部固定的两行内容,该内容后续不会被修改
- 所有动态更新的内容全部在固定内容下方输出,更新时仅需要将光标移动到动态内容的起始位置,清空原有内容后打印新内容即可,不会影响上方固定行
完整可运行代码
import sys import time import random # 兼容Windows旧版本系统开启虚拟终端支持(Win10 1511及以上版本可省略) if sys.platform == 'win32': import ctypes kernel32 = ctypes.windll.kernel32 kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7) # 仅打印一次顶部固定内容 print("Modeni") print("Thank You") xLoad = False _RAND_ = random.randint # 模拟启动加载逻辑 while not xLoad: # 打字机效果的加载提示 string1 = ' Loading Prerequisites. . . ' for letter in string1: time.sleep(0.01) sys.stdout.write(letter) sys.stdout.flush() sys.stdout.write('\n') sys.stdout.flush() # 自定义进度条替代tqdm total = _RAND_(800, 1999) for i in range(total): time.sleep(0.0001) # 计算进度条样式 progress = (i + 1) / total bar_len = 30 filled_len = int(bar_len * progress) bar = '=' * filled_len + '-' * (bar_len - filled_len) # 动态更新当前行进度 sys.stdout.write(f'\r[{bar}] {progress:.1%}') sys.stdout.flush() xLoad = True # 加载完成后清空进度行,打印完成提示 sys.stdout.write('\r\033[K加载完成\n') sys.stdout.flush() time.sleep(3)
补充说明
如果需要更新多行动态内容,仅需要在更新前通过\033[nA将光标上移对应行数,再逐行清空打印即可,例如需要更新3行动态内容时,先执行sys.stdout.write('\033[3A')即可将光标定位到3行上方的动态内容起始位置。
内容的提问来源于stack exchange,提问作者Mokie Sz
相关产品推荐
相关产品推荐

