Python Prompt Toolkit 进度条功能详解
python-prompt-toolkit 项目地址: https://gitcode.com/gh_mirrors/pyt/python-prompt-toolkit
概述
Python Prompt Toolkit 提供了一套高级 API 用于在终端中显示进度条,其设计灵感来源于流行的 tqdm 库。这套 API 虽然相对较新,但已经经过充分测试,可以稳定使用。本文将深入介绍如何使用这个功能强大的进度条系统。
基础用法
简单进度条
创建一个基本进度条非常简单,只需使用 ProgressBar
上下文管理器包装任何可迭代对象即可:
from prompt_toolkit.shortcuts import ProgressBar
import time
with ProgressBar() as pb:
for i in pb(range(800)):
time.sleep(.01)
这段代码会显示一个包含进度百分比和进度条的动态界面。
处理未知长度的迭代器
对于无法预先知道总长度的生成器或迭代器,可以手动指定 total
参数:
def data_generator():
for _ in range(1000):
yield ...
with ProgressBar() as pb:
for item in pb(data_generator(), total=1000):
process_item(item)
高级功能
并行任务进度显示
Python Prompt Toolkit 的强大之处在于可以同时显示多个并行任务的进度:
from prompt_toolkit.shortcuts import ProgressBar
import time
import threading
with ProgressBar() as pb:
def task_1():
for i in pb(range(100), label="任务1"):
time.sleep(.05)
def task_2():
for i in pb(range(150), label="任务2"):
time.sleep(.08)
t1 = threading.Thread(target=task_1, daemon=True)
t2 = threading.Thread(target=task_2, daemon=True)
t1.start()
t2.start()
for t in [t1, t2]:
while t.is_alive():
t.join(timeout=.5)
注意设置 daemon=True
可以让线程在主程序退出时自动终止。
自定义标题和标签
进度条支持丰富的文本格式化功能,可以使用 HTML 样式标记:
from prompt_toolkit.formatted_text import HTML
title = HTML('处理中 <style bg="yellow" fg="black">重要文件</style>')
label = HTML('<ansired>当前项目</ansired>: ')
with ProgressBar(title=title) as pb:
for i in pb(range(800), label=label):
time.sleep(.01)
深度定制
进度条格式定制
进度条的显示格式可以完全自定义:
from prompt_toolkit.shortcuts.progress_bar import formatters
from prompt_toolkit.styles import Style
style = Style.from_dict({
'label': 'bg:#ffff00 #000000',
'percentage': 'bg:#ffff00 #000000',
'current': '#448844',
'bar': '',
})
custom_formatters = [
formatters.Label(),
formatters.Text(': [', style='class:percentage'),
formatters.Percentage(),
formatters.Text(']', style='class:percentage'),
formatters.Text(' '),
formatters.Bar(sym_a='#', sym_b='#', sym_c='.'),
formatters.Text(' '),
]
with ProgressBar(style=style, formatters=custom_formatters) as pb:
for i in pb(range(1600), label='安装中'):
time.sleep(.01)
添加交互功能
可以像其他 Prompt Toolkit 应用一样添加键盘绑定:
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.patch_stdout import patch_stdout
kb = KeyBindings()
cancel_flag = [False]
@kb.add('f')
def print_f(event):
print('按下了f键')
@kb.add('x')
def cancel_progress(event):
cancel_flag[0] = True
with patch_stdout():
with ProgressBar(key_bindings=kb) as pb:
for i in pb(range(800)):
time.sleep(.01)
if cancel_flag[0]:
break
使用 patch_stdout()
可以确保打印内容正确显示在进度条上方。
最佳实践
- 对于长时间运行的任务,建议显示有意义的标签和标题
- 并行任务时,为每个任务设置描述性标签
- 考虑添加取消功能,提升用户体验
- 使用
patch_stdout
处理任何打印输出 - 根据应用场景选择合适的进度条样式
Python Prompt Toolkit 的进度条系统提供了丰富的定制选项,可以满足从简单到复杂的各种进度显示需求。通过合理使用这些功能,可以为命令行应用增添专业级的用户体验。
python-prompt-toolkit 项目地址: https://gitcode.com/gh_mirrors/pyt/python-prompt-toolkit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考