1.安裝progress庫
progress是Python第三方函式庫,在終端機執行 pip 指令安裝。
pip install progress
2.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。
大部分Python程式設計師都使用PyCharm,如果在PyCharm中執行進度條碼後沒有顯示進度條效果,可以依照如下步驟設置,再重新運行程式碼。
Step1. 點選PyCharm上方的 Run 按鈕,然後點選 Edit Configurations,進入執行設定頁面。
Step2. 將 Emulate terminal in output console 選項打鉤,然後重新執行程式碼。
細心的小夥伴應該發現了,上面的進度條碼在PyCharm中運行完成後,進度條下有一串奇怪的字元: ‘?[?25h&rsquo ; ,在終端機中用腳本方式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函式庫實作進度條的詳細內容。更多資訊請關注PHP中文網其他相關文章!