我有一个来自先前post的ProcessingFlush类。我编写了这个类,以便打印一系列点(由索引给出)来测试我的软件是否正在处理我的数据时,数据的大小是 at priori 。
class ProcessingFlush(object):
def __init__(self, index):
if index > 70:
raise ValueError("Index not valid")
self.index = index
def update(self, n):
self._n = n
self._display()
def finish(self):
sys.stdout.flush()
def start(self):
sys.stdout.write("Processing")
def _display(self):
sys.stdout.write("Processing %s%s\r" % ((n % index)* ".", (index - 1 - (n % index))* " "))
sys.stdout.flush()
pr = ProcessingFlush(5)
pr.start()
for n in xrange(5000):
pr.update(n)
pr.finish()
当处理非常快时,此类的限制是“处理”的闪烁效果。我试图发展这个想法来解决这个问题,但没有结果。我希望创建一个模块启动
def start(self):
sys.stdout.write("Processing")
仅打印处理。
def _display(self):
sys.stdout.write("%s%s%s\r" % ((" " * 10),(self._n % self.index)* ".", (self.index - 1 - (self._n % self.index))* " "))
sys.stdout.flush()
显示仅打印处理点。
答案 0 :(得分:1)
import sys
class progressBar:
'''
http://code.activestate.com/recipes/168639/
Randy Pargman
Improvements by Kelvie Wong
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=80):
self.progBar = '[]' # This holds the progress bar string
self.min = minValue
self.max = maxValue
self.span = maxValue - minValue
self.width = totalWidth
self.amount = 0 # When amount == max, we are 100% done
self.updateAmount(0) # Build progress bar string
def updateAmount(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.span)) * 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)
def __call__(self, value):
''' Updates the amount, and writes to stdout. Prints a carriage return
first, so it will overwrite the current line in stdout.'''
print '\r',
self.updateAmount(value)
sys.stdout.write(str(self))
sys.stdout.flush()
if __name__=='__main__':
import time
prog = progressBar(0, 100, 80)
for i in xrange(101):
prog.updateAmount(i)
sys.stdout.write('{p}\r'.format(p=prog))
sys.stdout.flush()
time.sleep(.025)
print