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()
我想要一个来自 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()