首頁  >  文章  >  後端開發  >  如何用Python中progress函式庫實作進度條

如何用Python中progress函式庫實作進度條

王林
王林轉載
2023-04-25 09:01:061807瀏覽

progress庫安裝與介紹

1.安裝progress庫

progress是Python第三方函式庫,在終端機執行 pip 指令安裝。

pip install progress

2.progress進度條效果顯示

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

如何用Python中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()

執行效果:

如何用Python中progress函式庫實作進度條

使用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,進入執行設定頁面。

如何用Python中progress函式庫實作進度條

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

如何用Python中progress函式庫實作進度條

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

這串字元表示的是遊標,在PyCharm中運作完成後,遊標被輸出在控制台上了。解決方法為:按住Ctrl 鍵,點擊導入的Bar 類名,跳到源碼bar.py 中,再按住Ctrl 鍵點擊Bar 類繼承的Progress 類,進入progress 庫的__init__.py 文件中,將該檔案中的SHOW_CURSOR 變數改為空字串。

如何用Python中progress函式庫實作進度條

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

如何用Python中progress函式庫實作進度條

在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()

運行效果:

如何用Python中progress函式庫實作進度條

#

还可以自己修改上面的参数,设置个性化的进度条,本文暂不扩展,以后有空可以专门写文章介绍。

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)

运行效果:

如何用Python中progress函式庫實作進度條

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)

运行效果:

如何用Python中progress函式庫實作進度條

汇总

接下来将上面介绍的所有种类的进度条全部放到一起,代码如下:

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函式庫實作進度條的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除