Skip to main content
 首页 » 编程设计

python之Python中简单的不确定进度条

2025年05月04日9bluestorm

<分区>

即使我害怕有点跑题,但我不确定还能在哪里问这个问题,抱歉!

我想用 Python 构建一个**简单**不确定的进度条

有一个真正有效的 p rogression bar module在 Python 中,但我的目标是构建一个简单的个人进度条,每次都添加到我的代码中

下面我的代码是一个简单的进度条,当你知道你的数据的maxvalue

from __future__ import division 
import sys 
 
 
class Progress(object): 
    def __init__(self, maxval): 
        self._pct = 0 
        self.maxval = maxval 
 
    def update(self, value): 
        pct = int((value / self.maxval) * 100.0) 
        if self._pct != pct: 
            self._pct = pct 
            self.display() 
 
    def start(self): 
        self.update(0) 
 
    def finish(self): 
        self.update(self.maxval) 
 
    def display(self): 
        sys.stdout.write("\r|%-73s| %d%%" % ('#' * int(self._pct*.73), self._pct)) 
        sys.stdout.flush() 
 
 
import time 
 
toolbar_width = 300 
pbar = Progress(toolbar_width) 
pbar.start() 
for i in xrange(toolbar_width): 
    time.sleep(0.1) # do real work here 
    pbar.update(i) 
pbar.finish() 

现在我想创建一个新类 IndeterminateProgress(object),以便在数据的最大值未知时创建一个简单的不确定进度条。

基本思想是从 0 打印到 100,然后从 100 返回到 0,然后再打印,直到所有数据都被读取或处理完(代码在 Ethan Coon 的帮助下更新,见下文)

    class IndeterminateProgress(object): 
    def __init__(self): 
        self._pct = 0 
        self.maxval = 100 
 
    def update(self,value): 
        abs_pct = value % self.maxval   # this gives the percentage change from maxval 
        phase = int(value / self.maxval) % 2  # this gives whether the bar is increasing or decreasing in size 
        if phase == 0: 
            rel_pct = abs_pct / self.maxval * 100 
        else: 
            rel_pct = (self.maxval - abs_pct) / self.maxval * 100 
        if (rel_pct != self._pct): 
            self._pct = rel_pct 
            self.display() 
 
    def start(self): 
        self.update(0) 
 
    def display(self): 
        sys.stdout.write("\r|%-73s| %d%%" % ('#' * int(self._pct*.73), self._pct)) 
        sys.stdout.flush() 
 
 
data_flush = 30000000 
pbar = IndeterminateProgress() 
for i in xrange(data_flush): 
    time.sleep(0.1) # do real work here 
    pbar.update(i) 

用 windows 的命令提示符测试,100% 后的进度条回到 0%,转到 100% 但在此之后创建了一个新的进度条。

想法是只打印一行不确定的进度条