Python 进度条 tqdm

Python ProgressBar tqdm

我想要一个来自 tqdm 对象的 progressBar 包装器对象,该对象在默认情况下处于禁用状态,可以根据条件启用。此外,它应该在控制台和 jupyter notebook/lab/ipython 中工作。因此 tqdm 具有自动检测功能。我写了一个class:

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 3.7 Windows.

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

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

此外,将导入语句放在 class 中通常不是一个好主意。如果你的模块总是导入另一个模块,根据 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()

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

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()