Python Prompt Toolkit 进度条功能详解

Python Prompt Toolkit 进度条功能详解

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() 可以确保打印内容正确显示在进度条上方。

最佳实践

  1. 对于长时间运行的任务,建议显示有意义的标签和标题
  2. 并行任务时,为每个任务设置描述性标签
  3. 考虑添加取消功能,提升用户体验
  4. 使用 patch_stdout 处理任何打印输出
  5. 根据应用场景选择合适的进度条样式

Python Prompt Toolkit 的进度条系统提供了丰富的定制选项,可以满足从简单到复杂的各种进度显示需求。通过合理使用这些功能,可以为命令行应用增添专业级的用户体验。

python-prompt-toolkit python-prompt-toolkit 项目地址: https://gitcode.com/gh_mirrors/pyt/python-prompt-toolkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

解卿靓Fletcher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值