通过Progbar()在Python中实现自定义进度条效果
发布时间:2024-01-14 12:37:31
在Python中,我们可以使用Progbar()函数来实现自定义进度条效果。Progbar()函数提供了一个简单的方法来显示进度条和完成百分比。
下面是一个使用例子,展示了如何使用Progbar()函数来显示一个简单的进度条,其中有一个循环来模拟任务的执行:
from time import sleep
from progbar import Progbar
# 初始化进度条对象,设置总步骤数
progress_bar = Progbar(100)
# 模拟执行任务
for i in range(100):
# 执行任务的代码
sleep(0.1) # 模拟任务的执行时间
# 更新进度条,设置当前完成的步骤数
progress_bar.update(i + 1)
在上面的例子中,通过导入Progbar类并实例化一个对象progress_bar来初始化进度条,设置总的步骤数为100。然后,在任务的执行过程中使用progress_bar.update()方法来更新进度条,传入当前完成的步骤数。在每个任务执行的循环中,我们模拟了任务执行过程使用了sleep()函数。
使用这个方法创建的进度条将在每个循环迭代中自动更新,并在控制台中显示出来。进度条的显示方式是一个简单的文本进度条,包含完成百分比和当前完成的步骤数。
然而,需要注意的是,为了使用Progbar()函数,我们需要将progbar.py文件下载并放在同一个目录下。这个文件是一个Python脚本,提供了Progbar类的实现。
这是Progbar类的代码实现:
import sys
class Progbar(object):
def __init__(self, target, width=30, verbose=1):
'''
Initialize the Progbar class.
# Arguments
target: Total number of steps expected, None if unknown.
width: Progress bar width on screen.
verbose: Whether to update the progress bar with current step, speed, etc.
'''
self.target = target
self.width = width
self.verbose = verbose
self.total_width = 0
self.seen_so_far = 0
self.start = time.time()
self.last_update = 0
def update(self, current, values=None):
'''
Updates the progress bar.
# Arguments
current: Index of current step.
values: List of tuples:
(name, value) or (name, value, info).
name will be displayed on the left of progress bar.
value or info will be displayed to the right of progress bar.
'''
if self.target is None:
self.target = current
if current < self.seen_so_far:
return
now = time.time()
info = ''
if self.verbose == 1:
if now - self.last_update < 1:
return
steps_per_sec = (current - self.last_update) / (now - self.last_update)
self.last_update = now
time_left = (self.target - current) / steps_per_sec
info = ' - ETA: ' + self.format_time(time_left)
elif self.verbose == 2:
if now - self.last_update < 1:
return
steps_per_sec = (current - self.last_update) / (now - self.last_update)
self.last_update = now
time_left = (self.target - current) / steps_per_sec
info = ' - ETA: ' + self.format_time(time_left)
elif self.verbose == 0:
if current == self.target:
info = ' - done'
prev_total_width = self.total_width
sys.stdout.write('\b' * prev_total_width)
sys.stdout.write('\r')
if self.target is not None:
numdigits = int(np.floor(np.log10(self.target))) + 1
barstr = '%%%dd/%%%dd [' % (numdigits, numdigits)
bar = barstr % (current, self.target)
prog = float(current) / self.target
prog_width = int(self.width * prog)
if prog_width > 0:
bar += ('=' * (prog_width - 1))
if current < self.target:
bar += '>'
else:
bar += '='
bar += ('.' * (self.width - prog_width))
bar += ']'
else:
bar = '%7d/Unknown' % current
self.total_width = len(bar)
sys.stdout.write(bar)
sys.stdout.write(info)
sys.stdout.flush()
if current >= self.target:
sys.stdout.write('
')
self.seen_so_far = current
通过上面的例子和代码实现,我们可以自定义进度条的宽度、显示的内容以及更新的频率来满足不同的需求。
