-
Notifications
You must be signed in to change notification settings - Fork 3
/
ProgressBar.py
102 lines (88 loc) · 3.32 KB
/
ProgressBar.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#! /usr/bin/python2
# vim: set fileencoding=utf-8
import sys
import time
from timeit import default_timer as clock
# from http://thelivingpearl.com/progress_bar_1-py-code/
# add unicode and time remaining
class ProgressBar(object):
"""ProgressBar class holds the options of the progress bar.
The options are:
start State from which start the progress. For example, if start is
5 and the end is 10, the progress of this state is 50%
end State in which the progress has terminated.
width --
fill String to use for "filled" used to represent the progress
blank String to use for "filled" used to represent remaining space.
format Format
incremental
"""
def __init__(self, start=0, end=10, width=12, fill=u'█', blank=' ',
format=u'▏{fill}{blank}▕ {progress}% ETA: {eta:.1f}s',
incremental=True):
super(ProgressBar, self).__init__()
self.start = start
self.end = end
self.width = width
self.fill = fill
self.blank = blank
self.format = format
self.incremental = incremental
self.step = 100 / float(width) # fix
self.sof = None
self.remaining = -1.0
self.reset()
def __add__(self, increment):
if self.sof is None:
self.sof = clock()
elapsed = 0
else:
elapsed = clock() - self.sof
increment = self._get_progress(increment)
if 100 > self.progress + increment:
self.progress += increment
self.remaining = 100*elapsed/self.progress - elapsed
else:
self.progress = 100
self.remaining = 0
return self
def __unicode__(self):
progressed = int(self.progress / self.step) # fix
fill = progressed * self.fill
blank = (self.width - progressed) * self.blank
return self.format.format(fill=fill, blank=blank,
progress=int(self.progress),
eta=self.remaining)
def __str__(self):
return unicode(self).encode('utf-8')
__repr__ = __str__
def _get_progress(self, increment):
return float(increment * 100) / self.end
def reset(self):
"""Resets the current progress to the start point"""
self.progress = self._get_progress(self.start)
return self
class AnimatedProgressBar(ProgressBar):
"""Extends ProgressBar to allow you to use it straighforward on a script.
Accepts an extra keyword argument named `stdout` (by default use
sys.stdout) and may be any file-object to which send the progress status.
"""
def __init__(self, *args, **kwargs):
super(AnimatedProgressBar, self).__init__(*args, **kwargs)
self.stdout = kwargs.get('stdout', sys.stdout)
def show_progress(self):
if hasattr(self.stdout, 'isatty') and self.stdout.isatty():
self.stdout.write('\r')
else:
self.stdout.write('\n')
self.stdout.write(str(self))
self.stdout.flush()
if __name__ == '__main__':
p = AnimatedProgressBar(end=200, width=80, blank=' ', fill=u'█')
while True:
p + 5
p.show_progress()
time.sleep(0.2)
if p.progress == 100:
break
print # new line