Python 进度条 tqdm

标签 python progress-bar tqdm

我想从 tqdm 对象中获得一个进度条包装对象,该对象默认情况下处于禁用状态,可以根据条件启用。此外,它应该在控制台和 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 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()

关于Python 进度条 tqdm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56794127/

相关文章:

java - 加载另一个 JFrame 类的进度条

python-3.x - 如何在customtkinter上添加进度条?

python - 如何在 Keras 中设置双向 LSTM 层的初始状态?

python - 在 Django 中注册自定义过滤器

python - 将单选按钮与 Django 中的表行关联

python - 有关获取 aerospike 集中记录总数的说明?是否需要 Lua 脚本?

JavaFX - 将另一个类的属性绑定(bind)到状态栏

html - 带有 HTML 和 CSS 的进度条

python - 在 tqdm 进度条下方打印文本