【问题标题】:Python ProgressBar tqdmPython 进度条 tqdm
【发布时间】:2019-06-27 15:13:57
【问题描述】:

我想从 tqdm 对象中获得一个 progressBar 包装器对象,该对象默认情况下是禁用的,可以通过条件启用。此外,它应该在控制台和 jupyter notebook/lab/ipython 中工作。因此 tqdm 具有自动检测功能。我写了一个类:

class ProgressBar(object):
    import time
    import numpy as np
    from tqdm import tnrange
    from tqdm.auto import tqdm
    def __init__(self,maxValue,minValue=0):
        self.minValue=minValue
        self.maxValue=maxValue
        self.progressBar = self.createProgressBar()
    def updateBar(self,updatedValue):
        self.progressBar.update(updatedValue)
    def createProgressBar(self):
        bar = tqdm(total=self.maxValue,desc='Loading:',disable=True)
        return bar

但如果我想进入酒吧

a = ProgressBar(1000)
a.progressBar.disable=False
while True:
    fileEvaluated = np.random.randint(4,size=1)[0]
    a.updateBar(fileEvaluated)
    time.sleep(0.5)

我收到一条错误消息:

AttributeError: 'tqdm_notebook' object has no attribute 'sp'

知道我做错了什么吗?

【问题讨论】:

    标签: python progress-bar tqdm


    【解决方案1】:

    我会做类似以下的事情,它已经过测试并且可以在 Python 3.7 Windows 上运行。

    它可能对您不起作用的原因之一是您禁用了进度条bar = tqdm(total=self.maxValue,desc='Loading:',disable=True),但随后您尝试使用a.progressBar.disable=False 启用它,但您创建的类不包含禁用属性。

    为了将它包裹在某些东西上,它需要是一个可迭代的,如我发布的代码中所示。你可能不需要time.sleep() 代码,我只是把它放在那里,这样你就可以看到正在运行的进度条,否则它会完成得太快。

    此外,将 import 语句放在类中通常不是一个好主意。如果你的模块总是会导入另一个模块,那么根据 PEP 8,导入应该放在最顶部。

    编辑:如果您只希望进度条在某些条件之后运行,则将update() 调用嵌套在条件之后,如下所示。

    from tqdm import tqdm
    import time
    
    
    class ProgressBar(object):  # Python3+ '(object)' can be omitted
        def __init__(self, max_value, disable=True):
            self.max_value = max_value
            self.disable = disable
            self.p = self.pbar()
    
        def pbar(self):
            return tqdm(
                total=self.max_value,
                desc='Loading: ',
                disable=self.disable
            )
    
        def update(self, update_value):
            self.p.update(update_value)
    
        def close(self):
            self.p.close()
    
    
    max_val = 1000
    some_condition = True
    
    p = ProgressBar(max_value=max_val, disable=False)
    
    if some_condition:
        for i in range(max_val):
            time.sleep(0.01)
            p.update(1)
        p.close()
    

    你也可以做和上面一样的事情,但不用自己做类,减少代码量。

    from tqdm import tqdm
    import time
    
    max_val = 1000
    some_condition = True
    
    p = tqdm(total=max_val, disable=False)
    
    if some_condition:
        for i in range(max_val):
            time.sleep(0.01)
            p.update(1)
        p.close()
    

    【讨论】:

    • 感谢您的方法。但问题是,我首先要禁用progressBar,然后在我的代码中,如果触发了某些条件,则应该启用它。所以初始化它 p = ProgressBar(max_value=max_value, disable=True) 然后 p.disable=False
    • tqdm 禁用功能实际上并不是您可以在创建 tqdm 类的实例后更改的选项。如果您深入研究进度条的源代码,则可能可以完成,但是您可以通过将进度条将跟踪的代码部分嵌套在条件语句中轻松实现您的要求。我稍微编辑了代码的最底部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2018-10-13
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多