2017-08-17 116 views
0

我使用Python 3.x並下載了progressbar2庫;然而,我正在努力如何在我的程序中使用它。當有指定的範圍時,一切正常,但我如何通過自己的代碼實時更新進度條?我希望進度條在文本列表的每一次迭代中跳躍20%,並首先顯示並在打印結果時刷新進度。CLI中的Python ProgressBar

我還發現了另一個類似於我的Stack的問題,但我更喜歡使用progressbar2庫,因爲它已經在那裏了。考慮以下幾點:

import time 
import progressbar 

texts = ['a', 'b', 'c', 'd', 'e'] 

def basic_widget_example (texts): 

    widgets = [progressbar.Percentage(), progressbar.Bar()] 
    bar = progressbar.ProgressBar (widgets = widgets, max_value = len (texts)).start() 
    for i in range (len (texts)): 
     print (texts [i]) 
     time.sleep (0.1) 
     bar.update (i + 1) 
    bar.finish() 

結果:

N/A%|                            |a 
20%|######################                       |b 
40%|############################################                 |c 
60%|##################################################################            |d 
80%|########################################################################################      |e 
100%|###############################################################################################################| 

我想它看起來就像這樣:

100%|#############################################################| 
a 
b                              
c                              
d                              
e  

一種解決方案是創建2環,但你可以看到進度條顯示不再準確或與我的任務同步。即使我的任務可能需要2分鐘才能完成,進度條仍會在不到一秒的時間內顯示100%。任何想法如何在儘可能接近準確的情況下做到這一點?

def basic_widget_example (texts): 

    widgets = [progressbar.Percentage(), progressbar.Bar()] 
    bar = progressbar.ProgressBar (widgets = widgets, max_value = len (texts)).start() 
    for i in range (len (texts)): 
     # Do something 
     time.sleep (0.1) 
     bar.update (i + 1) 
    bar.finish() 

    for text in texts: 
     print (text) 

回答

0

我錯誤地解釋了進度條的用法。進度條意在讓用戶知道,在沒有需要與用戶通信的情況下進行計算。在場景後面發生一些字符串操作或從一組數據創建列表的情況下,這很有用。一旦達到結果並準備好輸出到屏幕上,那時就不需要進度條了。作爲一個例子,我創建了一個從1到50的整數列表,並在其中添加了1(後臺進程),並將其添加到另一個將用於模擬輸出的列表中。

lst = [i for i in range (50)] 
basic_widget_example (lst) 

def basic_widget_example (lst): 

    newlist = [] 

    widgets = [progressbar.Percentage(), progressbar.Bar()] 
    bar = progressbar.ProgressBar (widgets = widgets, max_value = len (lst)).start() 
    for i in range (len (lst)): 
     # Do something 
     newlist = [x + 1 for x in lst] 
     time.sleep (0.1) 
     bar.update (i + 1) 
    bar.finish() 

    print (newlist [:5]) 

結果:

100%|###############################################################################################################| 
[1, 2, 3, 4, 5] 

進度條被遞增與它是由「MAX_VALUE」指定50的列表的長度。這將在每次迭代中產生兩個'#'。

還值得一提的是time.sleep(value)對應於進度條完成所需的時間。在我的例子中,50次迭代* 0.1秒= 5秒。這意味着進度條將在5秒內完成100%。這不是實時的。需要進一步計算才能實時獲得睡眠值。一個想法是計算每次迭代所需的時間或取平均值,並將其用作time.sleep的值。