首頁 > 軟體

一文教你用Python中progress庫實現進度條

2023-03-25 06:01:38

progress庫安裝和介紹

1.安裝progress庫

progress是Python第三方庫,在終端執行 pip 命令安裝。

pip install progress

2.progress進度條效果展示

progress的pypi源地址為:https://pypi.org/project/progress/

在官網可以看到progress能實現的各種進度條效果,如下動圖。

progress實現進度條

# coding=utf-8
from progress.bar import Bar
import time

# 建立Bar類的範例
bar = Bar('MyProcess:', max=100)
# 迴圈處理某業務,呼叫bar物件的next()方法,迴圈次數等於max
for _ in range(100):
	# Do some work
    time.sleep(0.05)
    bar.next()
# 迴圈完成後呼叫finish()方法
bar.finish()

執行效果:

使用 progress 庫實現進度條很簡單,從 progress 庫的 bar.py 中匯入 Bar 類,範例化一個物件,然後迴圈處理業務和呼叫 next() 方法,處理完成後呼叫 finish() 方法結束進度條。

Bar 類的主要引數有:

  • message: 進度條顯示的資訊,這個引數預設可以用位置引數傳給 Bar 。
  • width: 修改進度條的寬度,預設32。
  • max: 進度條被分成幾等份,如100。
  • suffix: 進度百分比顯示的格式,預設 ‘%(index)d/%(max)d’ 。
  • fill: 進度條用什麼填充,預設’#’ 。
  • empty_fill: 未載入的進度條用什麼填充,預設空格’ ’ 。
  • bar_prefix: 進度條字首,預設’ |’ 。
  • bar_suffix: 進度條字尾,預設’| ’ 。
  • color: 進度條的顏色,預設None。

PyCharm進度條顯示問題解決

大部分Python程式設計師都使用PyCharm,如果在PyCharm中執行進度條程式碼後沒有顯示進度條效果,可以按照如下步驟設定,再重新執行程式碼。

Step1. 點選PyCharm上方的 Run 按鈕,然後點選 Edit Configurations,進入執行設定頁面。

Step2. 將 Emulate terminal in output console 選項打鉤,然後重新執行程式碼。

細心的小夥伴應該發現了,上面的進度條程式碼在PyCharm中執行完成後,進度條下有一串奇怪的字元: ‘?[?25h’ ,在終端中用指令碼方式 python progress_demo.py 執行相同的程式碼,不會有這串符號。

這串字元表示的是遊標,在PyCharm中執行完成後,遊標被輸出在控制檯上了。解決方法為:按住 Ctrl 鍵,點選匯入的 Bar 類名,跳轉到原始碼 bar.py 中,再按住 Ctrl 鍵點選 Bar 類繼承的 Progress 類,進入 progress 庫的 __init__.py 檔案中,將該檔案中的 SHOW_CURSOR 變數改為空字串。

修改原始碼後再重新執行程式碼,遊標不顯示了,那一串字元也就不顯示了。

在PyChram中執行進度條,還可能會遇到其他顯示問題,建議出現問題時,用指令碼的方式執行,以指令碼執行的結果為準,PyChram中執行只用來偵錯程式碼。

進度條程式碼的另外兩種寫法

1. 上下文管理器: 使用 with … as … 上下文管理器的方式編寫進度條,進度條完成後無需呼叫 finish() 方法。

with Bar('Processing', max=20) as bar:
    for i in range(20):
        time.sleep(0.05)
        bar.next()

2. 使用 iter() 方法: 使用 iter() 方法可以簡化迭代器的工作,不需要呼叫 next() 方法。

for i in Bar('Processing').iter(range(100)):
    time.sleep(0.05)

這兩種實現方式執行的結果與最開始的實現方式一樣。

實現更多種類的進度條

1. Bar 系列

前文中點進了progress的原始碼,可以看到 Bar 類繼承自 Progress 類,Progress 類繼承自 Infinite 類,Progress 類和 Infinite 類實現了進度條的基本功能。

在 bar.py 中,除了 Bar 類,還有6個類,ChargingBar, FillingSquaresBar, FillingCirclesBar, IncrementalBar, PixelBar, ShadyBar,它們分別是 Bar 類的子類或孫類,繼承了進度條的功能,在每一個類中只是修改了 suffix, fill, empty_fill, bar_prefix, bar_suffix這些變數的值,修改了進度條的樣式。

使用很簡單,只需要匯入這些類,將上面程式碼中的 Bar 換成這些類就行了,如 FillingSquaresBar。

from progress.bar import Bar, ChargingBar, FillingSquaresBar, FillingCirclesBar, IncrementalBar, PixelBar, ShadyBar
import time

bar = FillingSquaresBar('MyProcess:', max=100)
for i in range(100):
    time.sleep(0.05)
    bar.next()
bar.finish()

執行效果:

還可以自己修改上面的引數,設定個性化的進度條,本文暫不擴充套件,以後有空可以專門寫文章介紹。

2. Spinner 系列

progress 庫的 spinner.py 中實現了 5 個類,Spinner, PieSpinner, MoonSpinner, LineSpinner, PixelSpinner。

from progress.spinner import Spinner, PieSpinner, MoonSpinner, LineSpinner, PixelSpinner

for i in Spinner('MySpinner:').iter(range(100)):
    time.sleep(0.01)

執行效果:

3.Counter 系列

progress 庫的 counter.py 中實現了 4 個類,Counter, Countdown, Stack, Pie。

from progress.counter import Counter, Countdown, Stack, Pie
import time

for i in Counter('Loading:').iter(range(100)):
    time.sleep(0.01)

執行效果:

彙總

接下來將上面介紹的所有種類的進度條全部放到一起,程式碼如下:

from progress.bar import Bar, ChargingBar, FillingSquaresBar, 
    FillingCirclesBar, IncrementalBar, PixelBar, ShadyBar
from progress.spinner import Spinner, PieSpinner, MoonSpinner, LineSpinner, PixelSpinner
from progress.counter import Counter, Countdown, Stack, Pie
import time
import random

progess_list = [Bar, ChargingBar, FillingSquaresBar, FillingCirclesBar, IncrementalBar,
                PixelBar, ShadyBar, Spinner, PieSpinner, MoonSpinner, LineSpinner,
                PixelSpinner, Counter, Countdown, Stack, Pie]
for P in progess_list:
    for i in P(P.__name__ + ':').iter(range(100)):
        time.sleep(0.01)

bar = IncrementalBar('Random:', suffix='%(index)d%%')
for i in range(100):
    bar.goto(random.randint(0, 100))
    time.sleep(0.01)
bar.finish()

執行效果:

執行程式碼後可以得出所有種類的進度條,與文章開頭從官網截的圖效果相同。

到此這篇關於一文教你用Python中progress庫實現進度條的文章就介紹到這了,更多相關Python progress進度條內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com