我們都知道钧椰,進(jìn)度條是用來直觀展示流程所需時間的優(yōu)秀工具粹断,以免我們擔(dān)心流程會突然掛掉,而且我們可以用它來預(yù)測代碼運行是否正常嫡霞,借助進(jìn)度條瓶埋,每個人都能直觀地看到腳本最新的進(jìn)展情況。
如果你之前沒用過進(jìn)度條诊沪,八成是覺得它會增加不必要的復(fù)雜性或者很難維護(hù)养筒,其實不然。要加一個進(jìn)度條其實只需要幾行代碼端姚。在這幾行代碼中晕粪,我們可以看看如何在命令行腳本以及 PySimpleGUI UI 中添加進(jìn)度條。
下文將介紹 4 個常用的 Python 進(jìn)度條庫:
Progress
第一個要介紹的 Python 庫是 Progress渐裸。
你只需要定義迭代的次數(shù)兵多、進(jìn)度條類型并在每次迭代時告知進(jìn)度條。
import timefrom progress.bar
import IncrementalBarmylist = [1,2,3,4,5,6,7,8]
bar = IncrementalBar('Countdown',max=len(mylist))
foritem in mylist:
bar.next()
time.sleep(1)
bar.finish()
Progress 實現(xiàn)的進(jìn)度條效果如下:
Progressbar 的增量進(jìn)度條
如果你不喜歡該進(jìn)度條的格式橄仆,還可以從以下格式中挑選:
ProgressBar 支持的進(jìn)度條類型。
相關(guān)文檔:https://pypi.org/project/progress/1.5/
tqdm
下面我們看一下 tqdm 庫衅斩。
和之前見過的庫差不多盆顾,這兩行代碼也非常相似,在設(shè)置方面有一點點不同:
importtimefrom tqdm
importtqdmmylist = [1,2,3,4,5,6,7,8]
for i in tqdm(mylist):
? time.sleep(1)
tqdm 實現(xiàn)的進(jìn)度條效果如下:
這個進(jìn)度條也提供了幾種選項畏梆。
相關(guān)文檔:https://tqdm.github.io/
Alive Progress
顧名思義您宪,這個庫可以使得進(jìn)度條變得生動起來,它比原來我們見過的進(jìn)度條多了一些動畫效果奠涌。
從代碼角度來說比較相似:
fromalive_progressimportalive_barimport
timemylist = [1,2,3,4,5,6,7,8]
withalive_bar(len(mylist))asbar:
foriinmylist:
? ? bar()
time.sleep(1)
進(jìn)度條的外觀和預(yù)期差不多:
這種進(jìn)度條有一些與眾不同的功能宪巨,使用起來會比較有趣,功能詳情可見項目:?https://github.com/rsalmei/alive-progress
PySimpleGUI
用 PySimpleGUI 得到圖形化進(jìn)度條
我們可以加一行簡單的代碼溜畅,在命令行腳本中得到圖形化進(jìn)度條捏卓。
為了實現(xiàn)上述內(nèi)容,我們需要的代碼是:
importPySimpleGUIassgimport
timemylist = [1,2,3,4,5,6,7,8]
fori,iteminenumerate(mylist):
sg.one_line_progress_meter('This is my progress meter!', i+1, len(mylist),'-key-')
time.sleep(1)
PySimpleGUI 應(yīng)用程序中的進(jìn)度條
項目作者之前曾經(jīng)在 GitHub 上討論過「如何快速啟動 Python UI慈格,然后使用 UI 創(chuàng)建比較工具」怠晴。在這個項目里遥金,作者還討論了一下如何集成進(jìn)度條。
代碼如下:
importPySimpleGUIassgimport
timemylist = [1,2,3,4,5,6,7,8]
progressbar = [ [sg.ProgressBar(len(mylist), orientation='h', size=(51, 10), key='progressbar')]]
outputwin = [ [sg.Output(size=(78,20))]]
layout = [ [sg.Frame('Progress',layout= progressbar)], [sg.Frame('Output', layout = outputwin)], [sg.Submit('Start'),sg.Cancel()]]
window = sg.Window('CustomProgressMeter', layout)
progress_bar = window['progressbar'] while True:
? event, values = window.read(timeout=10)
? if event == 'Cancel' or event is None:
? ? break
? elif event == 'Start':
? ? for i,item in enumerate(mylist):
? ? ? print(item)
? ? ? time.sleep(1)
? ? ? progress_bar.UpdateBar(i + 1)window.close()
沒錯蒜田,在 Python 腳本中使用進(jìn)度條只需要幾行代碼稿械,一點也不復(fù)雜。有了進(jìn)度條冲粤,以后也不用再猜測腳本運行地怎么樣了美莫。