Python制作进度条


本博客主要参考为北京大学陈斌老师的下一站Python

image

tqdm进度条

什么时候需要进度条?

  • 长时间的循环,让等待变得更加友好;
  • 统计运行时间和每次迭代平均时间;
  • 给人印象深刻的动态输出画面。

tqdm基本概念

  • 包裹并替代原有的可迭代对象,自动显示进度条;
  • 可以设定自定义信息;
  • 也可以自行控制进度条进展。

基础用法

# 准备测试数据
from time import sleep
from faker import Faker
f = Faker("en-us")
alist = [f.name() for _ in range(50)]

# 导入tqdm模块
from tqdm import tqdm, trange

用tqdm包裹range即可

p = 1
for i in tqdm(range(50)):
    p *= (i + 1)
    sleep(0.05)
print(f"{p=:,}")

或者可以用trange()达到相同的效果

p = 1
for i in trange(50): 
    p *= (i + 1)
    sleep(0.05)
print(f"{p=:,}")

image
对于其它可迭代对象,直接用tqdm包裹起来

s = ""
for name in tqdm(alist):
    s += f"{name=} "  # 假装处理一下
    sleep(0.05)
print(s)

image

设置进度条信息

# 处理中的信息
proc_bar = tqdm(range(50))
p = 1
for i in proc_bar:
    proc_bar.set_description(f"正在计算{i=:02d}")  # 设定前导信息
    p *= (i + 1)
    sleep(0.05)
print(f"{p=:,}")

image
或者把信息放在进度条后面

# 显示信息
proc_bar = tqdm(alist)
s = ""
for name in proc_bar:
    proc_bar.set_postfix({"正在处理":f"{name}"})  # 加在后面
    s += f"{name=} "  # 假装处理一下
    sleep(0.05)
print(s)

image

自定义控制

有时候我们不是直接用for循环迭代一个对象,例如使用opencv从视频中抽帧做处理。

# 自定义进度条
proc_bar = tqdm(total=100)  # 进度条对象
p = 1
n = 40
for i in range(n):
    #proc_bar.set_description(f"正在计算{i=:02d}")
    proc_bar.update(100/n)  # 更新进度条显示
    p *= (i + 1)
    sleep(0.05)
proc_bar.close()  # 关闭进度条,释放资源
print(f"{p=:,}")

image

例子:

cap = cv2.VideoCapture(path)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
with tqdm(total=total_frames) as pbar:
	pbar.set_description("Extracting all frames")
	while cap.isOpened():
		ret, frame = cap.read()
		pass # process(frame)
		cv2.imshow(frame, "frame")
		pbar.update(1)
		if cv2.waitKey(1)&0xFF == ord('q'):
                break

图形化进度条

from tqdm.tk import tqdm
# from tqdm.gui import tqdm
# from tqdm.rich import tqdm
s = ""
for name in tqdm(alist):
    s += f"{name=} "  # 假装处理一下
    sleep(0.05)
print(s)

tqdm.gui.tqdm会调用matplotlib,会消耗一定资源:
image

tqdm.tk.tqdm

posted @ 2022-12-01 10:32  Cisco_coco  阅读(158)  评论(0编辑  收藏  举报