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