Page Actions
Wiki Actions
User Actions
Submit This Story

一个Python进度条

在一堆旧文件里找到一个简单python的进度条,忘了是从哪里搞来的了… 效果如下:

[========>        25%                 ]

可以在初始化时设定进度条的宽度,最小值和最大值。 其实主要的原理就是Python的Print有一个简单的用法:

print somestring,

这样不会输出最后的换行,而如果把回车符号这样输出,就能起到抹去先前显示的内容的目的。

代码

代码如下:

# -*- coding: utf-8 -*-
#!/usr/bin/env python
 
import sys
class progressBar:
    def __init__(self, minValue = 0, maxValue = 100, totalWidth=80):
        """初始化
        """
        self.bar = "[]"   # 进度条字符串
        self.min = minValue
        self.max = maxValue
        self.span = maxValue - minValue
        self.width = totalWidth
        self.amount = 0       # 进度值。
        self.update(0)  # 构造初始进度条字符串
 
    def update(self, newAmount = 0):
        """ 用新数值更新进度条。
            如果数值参数在最大值/最小值范围以外,则显示最大值/最小值。
        """
        if newAmount < self.min: newAmount = self.min
        if newAmount > self.max: newAmount = self.max
        self.amount = newAmount
 
        # 计算新的进度百分比,取整。
        diffFromMin = float(self.amount - self.min)
        percentDone = (diffFromMin / float(self.span)) * 100.0
        percentDone = int(round(percentDone))
 
        # 计算显示某个进度所需要的条块
        allFull = self.width - 2
        numHashes = (percentDone / 100.0) * allFull
        numHashes = int(round(numHashes))
 
        # 用'='和'>'号构造进度条字符串,对空和满格进行特殊处理
        if numHashes == 0:
            self.bar = "[>%s]" % (' '*(allFull-1))
        elif numHashes == allFull:
            self.bar = "[%s]" % ('='*allFull)
        else:
            self.bar = "[%s>%s]" % ('='*(numHashes-1),
                                        ' '*(allFull-numHashes))
 
        # 计算百分比显示位置,基本位于中央 
        percentPlace = (len(self.bar) / 2) - len(str(percentDone))
        percentString = str(percentDone) + "%"
 
        # 把百分比插入进度条
        self.bar = ''.join([self.bar[0:percentPlace], percentString,
                                self.bar[percentPlace+len(percentString):]
                                ])
 
    def __str__(self):
        return str(self.bar)
 
    def __call__(self, value):
        """ 更新进度数字,显示进度条。先输出一个回车,使显示能够覆盖当前行。
        """
        print '\r',
        self.update(value)
        sys.stdout.write(str(self))
        sys.stdout.flush()

用法很简单,在任何python程序的循环里构造一个进度条对象, 指定进度条宽度和进度数,然后在更新进度条的时候print进度条对象:

def main(argv=None):
    # 从0开始,分255个步更新,宽度75
    prog = progressBar(0, 255, 75)
 
    for n in range(255):
        n += 1
        print prog(n),
        time.sleep(0.01)
 
    return 0

有个bug…显示进度条的行末会多一个”None”, 应该是某个空对象…

Discussion

Enter your comment
 
 
blog/2010/06/python_progressbar.txt · Last modified: 2010/06/27 22:45 by MeaCulpa     Back to top
Recent changes RSS feed Creative Commons License Powered by PHP Driven by DokuWiki