Source code for pymor.playground.progressbar
#!/usr/bin/env python
# This file is part of the pyMOR project (http://www.pymor.org).
# Copyright 2013-2017 pyMOR developers and contributors. All rights reserved.
# License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)
import sys
############################################################
#
# A progress bar that actually shows progress!
#
# Source:
# http://code.activestate.com/recipes/168639-progress-bar-class/
#
############################################################
[docs]class ProgressBar:
""" Creates a text-based progress bar. Call the object with the `print`
command to see the progress bar, which looks something like this::
[=======> 22% ]
You may specify the progress bar's width, min and max values on init.
"""
def __init__(self, minValue=0, maxValue=100, totalWidth=79):
self.progBar = "[]" # This holds the progress bar string
self.min = minValue
self.max = maxValue
self.width = totalWidth
self.amount = minValue # When amount == max, we are 100% done
self.update_amount(self.amount) # Build progress bar string
[docs] def update_amount(self, newAmount=0):
""" Update the progress bar with the new amount (with min and max
values set at initialization; if it is over or under, it takes the
min or max value as a default. """
if newAmount < self.min:
newAmount = self.min
if newAmount > self.max:
newAmount = self.max
self.amount = newAmount
# Figure out the new percent done, round to an integer
diffFromMin = float(self.amount - self.min)
percentDone = (diffFromMin / float(self.max - self.min)) * 100.0
percentDone = int(round(percentDone))
# Figure out how many hash bars the percentage should be
allFull = self.width - 2
numHashes = (percentDone / 100.0) * allFull
numHashes = int(round(numHashes))
# Build a progress bar with an arrow of equal signs; special cases for
# empty and full
if numHashes == 0:
self.progBar = "[>%s]" % (' ' * (allFull - 1))
elif numHashes == allFull:
self.progBar = "[%s]" % ('=' * allFull)
else:
self.progBar = "[%s>%s]" % ('=' * (numHashes - 1),
' ' * (allFull - numHashes))
# figure out where to put the percentage, roughly centered
percentPlace = (len(self.progBar) / 2) - len(str(percentDone))
percentString = str(percentDone) + "%"
# slice the percentage into the bar
self.progBar = ''.join([self.progBar[0:percentPlace], percentString,
self.progBar[percentPlace + len(percentString):]
])
def __str__(self):
return str(self.progBar)
[docs] def __call__(self, value):
""" Increases the amount by value, and writes to stdout. Prints a
carriage return first, so it will overwrite the current line in
stdout."""
if self.amount < self.max:
print('\r', end=' ')
self.update_amount(self.amount + value)
sys.stdout.write(str(self))
sys.stdout.write(self.amount < self.max and "\r" or "\n")
sys.stdout.flush()
def setMaximum(self, value):
self.max = value
def maximum(self):
return self.max
if __name__ == '__main__':
from time import sleep
p = ProgressBar()
for i in range(0, 201):
p(1)
if i == 90:
p.max = 200
sleep(0.02)