1. 程式人生 > 其它 >Python製作進度條

Python製作進度條

目錄
本部落格主要參考為北京大學陳斌老師的下一站Python

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=:,}")

對於其它可迭代物件,直接用tqdm包裹起來

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

設定進度條資訊

# 處理中的資訊
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=:,}")

或者把資訊放在進度條後面

# 顯示資訊
proc_bar = tqdm(alist)
s = ""
for name in proc_bar:
    proc_bar.set_postfix({"正在處理":f"{name}"})  # 加在後面
    s += f"{name=} "  # 假裝處理一下
    sleep(0.05)
print(s)

自定義控制

有時候我們不是直接用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=:,}")

例子:

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)