欢迎访问宙启技术站
智能推送

通过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

通过上面的例子和代码实现,我们可以自定义进度条的宽度、显示的内容以及更新的频率来满足不同的需求。