首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ProgressBar在CLI中的应用

ProgressBar在CLI中的应用
EN

Stack Overflow用户
提问于 2017-08-17 17:45:25
回答 1查看 754关注 0票数 2

我正在使用Python3.x并下载了progressbar2库;但是,我很难在我的程序中使用它。当有一个指定的范围时,一切都很好,但是如何用我自己的代码实时更新进度条呢?我期望进度栏在文本列表的每一次迭代中跳20%,首先显示它,并在打印结果时刷新进度。

我还在堆栈上发现了另一个类似于我的问题,但我更喜欢使用progressbar2库,因为它已经存在了。请考虑以下几点:

代码语言:javascript
代码运行次数:0
运行
复制
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 ()

结果:

代码语言:javascript
代码运行次数:0
运行
复制
N/A%|                                                                                                               |a
 20%|######################                                                                                         |b
 40%|############################################                                                                   |c
 60%|##################################################################                                             |d
 80%|########################################################################################                       |e
 100%|###############################################################################################################|

我希望它看起来像这样:

代码语言:javascript
代码运行次数:0
运行
复制
100%|#############################################################|
a
b                                                                                                                    
c                                                                                                                    
d                                                                                                                    
e     

一种解决方案是创建2 for-循环,但如您所见,进度条显示不再准确或与我的任务同步。进度栏将在不到一秒钟内显示100%,尽管我的任务可能需要2分钟才能完成。知道如何在接近准确的情况下做到这一点吗?

代码语言:javascript
代码运行次数:0
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-18 01:14:12

我误解了进度条的用法。进度条的意思是让用户知道在不需要与用户通信的情况下正在进行计算。在场景后面发生字符串操作或从一组数据创建列表的情况下,它非常有用。一旦实现了结果并准备好输出到屏幕上,就不需要在这一点上出现进度条了。

例如,我从1-50创建了一个整数列表,向它添加了1个(后台进程),并将其附加到将用于模拟输出的另一个列表中。

代码语言:javascript
代码运行次数:0
运行
复制
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])

结果:

代码语言:javascript
代码运行次数:0
运行
复制
100%|###############################################################################################################|
[1, 2, 3, 4, 5]

进度条将随着"max_value“指定的列表长度( 50 )而递增。这将在每次迭代中产生两个“#”。

还值得一提的是,time.sleep (值)对应于完成进度条所需的时间。在我的示例中,50次迭代*0.1秒=5秒。这意味着进度条将在5秒内100%完成。这不是实时的。如果是实时的话,需要进一步计算出睡眠值。一种方法是计算每次迭代所需的时间,或者取一个平均值,并将其用作time.sleep的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45741839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档