Last active
February 16, 2016 03:58
-
-
Save wassen/3f559de866415472b9b2 to your computer and use it in GitHub Desktop.
プログレスバー表示するモジュール
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
# -*- coding: utf-8 -*- | |
import sys | |
import time | |
class ProgressBar: | |
MAX_LENGTH_OF_BAR = 30 | |
@classmethod | |
def single_generator(cls,iterable): | |
pb = cls(iterable) | |
for item in iterable: | |
yield item | |
pb.display_progressbar() | |
def generator(self,index): | |
for item in self.iterables[index]: | |
yield item | |
if index == len(self.iterables) - 1: | |
self.display_progressbar() | |
def display_progressbar(self, *currentNums): | |
if currentNums == (): | |
currentNums = self.defaultCurrentNums; | |
self.update_defaultCurrentNums(); | |
if not len(self.maxNums) == len(currentNums): | |
print("引数の数が不正です。") | |
raise | |
percentage = self.get_percentage(currentNums) | |
if percentage > 1: | |
print("100%を超えました。引数が予期しない値であった可能性があります。") | |
raise | |
elif percentage == 1: | |
lf = '\n' | |
else : | |
lf = '' | |
self.time = time.time() - self.start; | |
MAX_LENGTH_OF_BAR = self.__class__.MAX_LENGTH_OF_BAR | |
lengthOfBar = int(MAX_LENGTH_OF_BAR * percentage) | |
outputStr = "".join([ | |
'[', | |
'='*lengthOfBar,('>' if lengthOfBar < MAX_LENGTH_OF_BAR else ''), | |
' ' * (MAX_LENGTH_OF_BAR - lengthOfBar - 1), | |
']', | |
'{0:.1f}%'.format(percentage * 100), | |
' 経過時間 ', | |
self.__class__.get_h_m_s(self.time), | |
lf | |
]) | |
#\033[K カーソル位置〜行末迄をクリア | |
sys.stderr.write('\r\033[K' + '\x1b[1;38;5;150m' + outputStr + '\x1b[0m') | |
sys.stderr.flush() | |
@classmethod | |
def get_h_m_s(cls,second): | |
second = int(second) | |
return '{0:0>2.0f}:{1:0>2.0f}:{2:0>2.0f}'.format(second//60//60,second//60%60,second%60) | |
def get_percentage(self,currentNums): | |
currentNums = list(currentNums) | |
#終わりを100%にするための措置 | |
currentNums[len(currentNums) - 1] += 1 | |
percentage = 0 | |
for i,(currentNum, maxNum) in enumerate(zip(currentNums,self.maxNums)): | |
if currentNum > maxNum: | |
print("最大値を超えています。") | |
raise | |
percentage += currentNum/self.__class__.prod(self.maxNums[:i+1]) | |
return percentage | |
@classmethod | |
def prod(cls,args): | |
num = 1 | |
for arg in args: | |
num*=arg | |
return num | |
def update_defaultCurrentNums(self): | |
dcns = list(reversed(self.defaultCurrentNums)) | |
maxNums = list(reversed(self.maxNums)) | |
dcns[0] += 1 | |
for i, (maxNum, dcn) in enumerate(zip(maxNums, dcns)): | |
if maxNum == dcn: | |
dcns[i] = 0 | |
if len(dcns) > i + 1: | |
dcns[i + 1] += 1 | |
self.defaultCurrentNums = list(reversed(dcns)) | |
def add(self,*args): | |
if all(isinstance(arg,int) for arg in args): | |
self.maxNums.extend(args) | |
self.defaultCurrentNums.extend([0]*len(args)) | |
elif all(self.__class__.isiterable(arg) for arg in args): | |
self.maxNums.extend([len(iterable) for iterable in args]) | |
self.defaultCurrentNums.extend([0]*len(args)) | |
self.iterables.extend(args) | |
else: | |
print("引数が不正です。") | |
raise | |
@classmethod | |
def isiterable(cls, obj): | |
return isinstance(obj, str) or hasattr(obj, '__iter__') | |
def __init__(self,*args): | |
self.start = time.time() | |
self.time = 0 | |
if all(isinstance(arg,int) for arg in args): | |
self.maxNums = list(args) | |
self.defaultCurrentNums = [0]*len(args) | |
elif all(self.__class__.isiterable(arg) for arg in args): | |
self.maxNums = [len(iterable) for iterable in args] | |
self.defaultCurrentNums = [0]*len(args) | |
self.iterables = list(args) | |
else: | |
print("引数が不正です。") | |
raise | |
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
from ProgressBar import ProgressBar as pb | |
import time | |
list1 = "いてらぶる" | |
list2 = range(3) | |
list3 = [1,0] | |
#使い方1 | |
pb1 = pb(list1,list2,list3) | |
for _ in list1: | |
for _ in list2: | |
for _ in list3: | |
time.sleep(0.1) | |
pb1.display_progressbar() | |
#使い方2 | |
pb2 = pb(list1, list2, list3) | |
for _ in pb2.generator(0): | |
for _ in pb2.generator(1): | |
for _ in pb2.generator(2): | |
time.sleep(0.1) | |
#使い方3 | |
for _ in pb.single_generator(list1): | |
for _ in list2: | |
for _ in list3: | |
time.sleep(0.1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment