我想要一个来自tqdm对象的progressBar包装器对象,它在默认情况下是禁用的,可以通过条件启用。此外,它应该在控制台和jupyter笔记本/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'你知道我做错了什么吗?
发布于 2019-06-28 09:39:30
我会做类似以下的事情,这是在Python3.7Windows上测试并运行的。
它可能无法为您工作的原因之一是,您禁用了进度条禁用,但随后您尝试使用a.progressBar.disable=False启用它,但您创建的类不包含bar = tqdm(total=self.maxValue,desc='Loading:',disable=True)属性。
为了包装它,它需要是一个迭代器,如我发布的代码中所示。您可能不需要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()https://stackoverflow.com/questions/56794127
复制相似问题