Python 进度条 tqdm

问题描述 投票:0回答:2

我想从 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
2个回答
2
投票

我会做类似下面的事情,它已经过测试并且可以在 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()

0
投票

改变时它对我有用

从 tqdm.notebook 导入 tqdm 到 从 tqdm 导入 tqdm

© www.soinside.com 2019 - 2024. All rights reserved.