在Python中,制作进度条是一项很实用的功能,尤其在需要处理大量数据或执行耗时任务时,用户能够清楚地看到任务的进度。下面,我将介绍18种常见的Python进度条实现方式,并提供相应的代码示例。

1. 使用 print 函数

最基础的进度条可以用 print 函数和简单的字符来实现。

import time
import sys

def simple_progress_bar(iterable):
    total = len(iterable)
    for i, item in enumerate(iterable):
        time.sleep(0.1)  # 模拟处理时间
        percent = (i + 1) / total * 100
        bar = '#' * (i + 1) + '-' * (total - i - 1)
        sys.stdout.write(f'\r[{bar}] {percent:.2f}%')
        sys.stdout.flush()
    print()  # 打印换行

simple_progress_bar(range(100))

2. 使用 tqdm

tqdm 是一个非常方便的进度条库,只需几行代码即可实现。

from tqdm import tqdm
import time

for i in tqdm(range(100)):
    time.sleep(0.1)

3. 使用 progress

progress 库同样提供了灵活的进度条。

from progress.bar import Bar
import time

bar = Bar('Processing', max=100)
for i in range(100):
    time.sleep(0.1)
    bar.next()
bar.finish()

4. 使用 alive-progress

alive-progress 提供了更为美观的进度条。

from alive_progress import alive_bar
import time

with alive_bar(100) as bar:
    for i in range(100):
        time.sleep(0.1)  # 模拟处理时间
        bar()

5. 自定义进度条

我们可以自定义进度条的样式。

import time

def custom_progress_bar(total):
    for i in range(total):
        time.sleep(0.1)
        percent = (i + 1) / total * 100
        bar = '#' * (i + 1) + '-' * (total - i - 1)
        print(f'\r|{bar}| {percent:.2f}%', end='')

custom_progress_bar(50)
print()  # 换行

6. 使用 click

click 库也可以用于创建命令行界面的进度条。

import click
import time

@click.command()
def cli():
    with click.progressbar(length=100, label='Processing') as bar:
        for _ in range(100):
            time.sleep(0.1)
            bar.update(1)

if __name__ == '__main__':
    cli()

7. 嵌套进度条

对于嵌套循环,可以使用多个进度条。

from tqdm import tqdm
import time

for i in tqdm(range(5), desc='Outer loop'):
    for j in tqdm(range(100), desc='Inner loop', leave=False):
        time.sleep(0.01)

8. 进度条与多线程结合

结合多线程和进度条,实现并发。

import threading
import time
from tqdm import tqdm

def worker(bar):
    for _ in range(100):
        time.sleep(0.1)  # 模拟工作
        bar.update(1)

bar = tqdm(total=100)
thread = threading.Thread(target=worker, args=(bar,))
thread.start()
thread.join()
bar.close()

9. 使用 rich

rich 库可提供丰富的文本样式和进度条。

from rich.progress import Progress
import time

with Progress() as progress:
    task = progress.add_task("Processing...", total=100)
    while not progress.finished:
        time.sleep(0.1)
        progress.update(task, advance=1)

10. 进度条的自定义更新速率

还可以自定义进度条更新的速率和区间。

import time

def dynamic_progress_bar(max_value):
    for i in range(max_value + 1):
        time.sleep(0.05)  # 模拟任务延迟
        if i % 10 == 0:
            print(f'Progress: {i}/{max_value}', end='\r')

dynamic_progress_bar(100)
print()  # 换行

11. 使用 PyQtTkinter 制作GUI进度条

这需要安装相应的库,而且相对复杂,这里简单展示 Tkinter 的实现。

import tkinter as tk
from tkinter import ttk
import threading
import time

def start_progress():
    for i in range(101):
        time.sleep(0.1)
        progress_var.set(i)

root = tk.Tk()
progress_var = tk.IntVar()
progress = ttk.Progressbar(root, maximum=100, variable=progress_var)
progress.pack()

button = tk.Button(root, text="Start", command=lambda: threading.Thread(target=start_progress).start())
button.pack()

root.mainloop()

12. 基于装饰器的进度条

通过装饰器的方式为函数增加进度条。

from tqdm import tqdm
import time

def with_progress_bar(func):
    def wrapper(*args, **kwargs):
        for _ in tqdm(range(100)):
            func(*args, **kwargs)
    return wrapper

@with_progress_bar
def do_work():
    time.sleep(0.1)

do_work()

13. 单线程异步进度条

结合 asyncio 实现异步进度条。

import asyncio
from tqdm import tqdm

async def async_worker():
    for _ in range(100):
        await asyncio.sleep(0.1)

async def main():
    with tqdm(total=100) as pbar:
        await async_worker()
        pbar.update(1)

asyncio.run(main())

14. 使用 simple_term_menu 动态更新进度条

用于终端的更复杂进度条。

from simple_term_menu import TerminalMenu
import time

def update_progress_bar(max_value):
    menu = TerminalMenu(["[ ]" for _ in range(max_value)], title="Progress")
    for i in range(max_value):
        time.sleep(0.1)  # 模拟工作
        menu.update_item(i, "[X]")
        menu.show()
update_progress_bar(5)

15. 使用 pyqtgraph 显示动态进度条

对图形动态绘制进度条。

from pyqtgraph.Qt import QtGui
import pyqtgraph as pg
import time

app = QtGui.QApplication([])

win = pg.GraphicsLayoutWidget(show=True)
bar = pg.BarGraphItem(x0=0, x1=1, y0=0, y1=0)

def update_bar():
    for i in range(1, 101):
        time.sleep(0.1)
        bar.setOpts(height=i)
        win.addItem(bar)

threading.Thread(target=update_bar).start()
QtGui.QApplication.instance().exec_()

16. 使用 curses 创建终端进度条

在命令行中实现更多样式的进度条。

import curses
import time

def progress_bar(stdscr):
    total = 100
    for i in range(total + 1):
        time.sleep(0.1)
        stdscr.addstr(0, 0, f'Progress: {i}/{total} [{="#" * i}{"-" * (total - i)}]')
        stdscr.refresh()
    stdscr.addstr(1, 0, "Done!")
    stdscr.refresh()
    stdscr.getch()

curses.wrapper(progress_bar)

17. 使用自定义线程与Tkinter实现进度条

结合多线程与GUI实现。

import tkinter as tk
import threading
import time

def task():
    for i in range(101):
        time.sleep(0.1)
        progress['value'] = i
        root.update_idletasks()

root = tk.Tk()
root.title("进度条示例")
progress = tk.ttk.Progressbar(root, length=300)
progress.pack(pady=20)
button = tk.Button(root, text='开始', command=lambda: threading.Thread(target=task).start())
button.pack(pady=10)

root.mainloop()

18. 使用 Pandas 进行数据处理时的进度条

对于数据分析任务,通过 tqdm.pandas() 来集成进度条。

import pandas as pd
from tqdm import tqdm

tqdm.pandas()
df = pd.DataFrame(range(1000))
df['squared'] = df[0].progress_apply(lambda x: x**2)

以上就是18种制作Python进度条的方式,从简单的字符实现到使用各种库和框架,涵盖了交互式和图形化等多种方法。无论你是在命令行下工作还是开发展示窗口,学习这些方法都能让你的程序更加友好和直观。希望本文对你有所帮助!

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部