-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
7eddfed
commit 7509e47
Showing
1 changed file
with
13 additions
and
106 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,112 +1,19 @@ | ||
#!/usr/bin/env python | ||
# | ||
# Corey Goldberg - 2010 | ||
# ascii command-line progress bar with percentage and elapsed time display | ||
# | ||
|
||
|
||
|
||
import sys | ||
import time | ||
|
||
|
||
|
||
class ProgressBar: | ||
def __init__(self, duration): | ||
self.duration = duration | ||
self.prog_bar = '[]' | ||
self.fill_char = '#' | ||
self.width = 40 | ||
self.__update_amount(0) | ||
|
||
def animate(self): | ||
for i in range(self.duration): | ||
if sys.platform.lower().startswith('win'): | ||
print self, '\r', | ||
else: | ||
print self, chr(27) + '[A' | ||
self.update_time(i + 1) | ||
time.sleep(1) | ||
print self | ||
|
||
def update_time(self, elapsed_secs): | ||
self.__update_amount((elapsed_secs / float(self.duration)) * 100.0) | ||
self.prog_bar += ' %ds/%ss' % (elapsed_secs, self.duration) | ||
|
||
def __update_amount(self, new_amount): | ||
percent_done = int(round((new_amount / 100.0) * 100.0)) | ||
all_full = self.width - 2 | ||
num_hashes = int(round((percent_done / 100.0) * all_full)) | ||
self.prog_bar = '[' + self.fill_char * num_hashes + ' ' * (all_full - num_hashes) + ']' | ||
pct_place = (len(self.prog_bar) / 2) - len(str(percent_done)) | ||
pct_string = '%d%%' % percent_done | ||
self.prog_bar = self.prog_bar[0:pct_place] + \ | ||
(pct_string + self.prog_bar[pct_place + len(pct_string):]) | ||
|
||
def __str__(self): | ||
return str(self.prog_bar) | ||
|
||
|
||
|
||
|
||
if __name__ == '__main__': | ||
""" example usage """ | ||
|
||
# print a static progress bar | ||
# [########## 25% ] 15s/60s | ||
|
||
p = ProgressBar(60) | ||
p.update_time(15) | ||
print 'static progress bar:' | ||
print p | ||
|
||
|
||
# print a static progress bar | ||
# [=================83%============ ] 25s/30s | ||
|
||
p = ProgressBar(30) | ||
p.fill_char = '=' | ||
p.update_time(25) | ||
print 'static progress bar:' | ||
print p | ||
|
||
|
||
# print a dynamic updating progress bar on one line: | ||
# | ||
# [################100%##################] 10s/10s | ||
# done | ||
|
||
secs = 10 | ||
p = ProgressBar(secs) | ||
print 'dynamic updating progress bar:' | ||
print 'please wait %d seconds...' % secs | ||
|
||
# spawn asych (threads/processes/etc) code here that runs for secs. | ||
# the call to .animate() blocks the main thread. | ||
|
||
p.animate() | ||
|
||
print 'done' | ||
|
||
|
||
""" | ||
example output: | ||
$ python progress_bar.py | ||
static progress bar: | ||
[########## 25% ] 15s/60s | ||
static progress bar: | ||
[=================83%============ ] 25s/30s | ||
dynamic updating progress bar: | ||
please wait 10 seconds... | ||
[################100%##################] 10s/10s | ||
done | ||
""" | ||
def progressbar(it, prefix = "", size = 60): | ||
count = len(it) | ||
def _show(_i): | ||
x = int(size*_i/count) | ||
sys.stdout.write("%s[%s%s] %i/%i\r" % (prefix, "#"*x, "."*(size-x), _i, count)) | ||
sys.stdout.flush() | ||
|
||
_show(0) | ||
for i, item in enumerate(it): | ||
yield item | ||
_show(i+1) | ||
sys.stdout.write("\n") | ||
sys.stdout.flush() |