2017-08-17 55 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的值。