Pythonで自作プログレスバーを作る
- 作成日: 2023-06-20
- 更新日: 2023-12-24
- カテゴリ: Python
Pythonで自作プログレスバー
プログレスバーというのは現在の進捗を視覚的に表示するバーのことです。
いま何パーセント終了しているの? というときに確認するのがプログレスバーです。
パッケージのダウンロードとかすると端末にプログレスバーが表示されて進捗が出ますよね。
あれなんですが今回は自作でプログレスバーを作ってみたいと思います。
関連記事
Djangoでオブジェクトを一括作成・更新【bulk_create, bulk_update】
DjangoのModel.objects.filter()の使い方【QuerySet】
Djangoのmodelのcreate()の使い方【Python】
Django入門: ルートの設定 ~ 簡単な一行掲示板アプリを作る その4【Windows10】
NumPyのappend()の使い方: 配列の末尾に要素を追加
Numpyのarangeの使い方: 指定範囲の数列を生成する
Python3でYoutube Data APIを使ってキーワード検索する
PythonからC言語(my.puts)を呼び出して実行する
ソースコード全文
ソースコードのライセンスはMITです。
import time
class Progress:
def __init__(self, end=100, cur=0, width=50):
self.end = end
self.cur = cur
self.width = width
def print(self):
n = int(self.width * (self.cur / self.end))
nn = self.width - n
n100 = int(100 * (self.cur / self.end))
s = '[' + n * '#' + nn * ' ' + '] ' + str(n100) + '%'
print(f'\r{s}', end='')
def add(self, n):
self.cur += n
def is_end(self):
return self.cur >= self.end
progress = Progress(200)
while True:
progress.print()
if progress.is_end():
break
progress.add(1)
time.sleep(0.1)
上記のコードを実行すると以下のように表示されます。
ソースコードの解説
先ほどのソースコードを解説します。
基本的な処理はProgress
というクラスで行います。
やってることはけっこう単純なので順に解説していきます。
まずProgress
を実際に使っているところのコードを見てみます。
Progressを実際に使っているところのコード
以下はProgress
を使って端末に進捗を表示しているコードです。
progress = Progress(200)
while True:
progress.print()
if progress.is_end():
break
progress.add(1)
time.sleep(0.1)
まずProgress
をオブジェクトにします。
progress = Progress(200)
この時、イニシャライザの引数にはend
の値を指定します。
200
というのがend
の値です。
この値は「全体の仕事総量」を指します。
たとえば100kbの画像のダウンロードであればこのend
の値は100
になります(最低1kbずつダウンロードする前提で)。
進捗というのは終わりが見えないと全体のパーセンテージを表示できません。
ですのでここで全体の仕事総量を指定しておく必要があります。
while True:
progress.print()
if progress.is_end():
break
progress.add(1)
time.sleep(0.1)
上記は無限ループに入って進捗を表示しているところです。
progress.print()
上記は進捗バーを端末にprint()
します。
これがバーを表示しているところです。
if progress.is_end():
break
progress.is_end()
は進捗が完了したらTrue
を返します。
進捗が完了している場合はループからbreak
します。
progress.add(1)
progress.add(1)
で進捗を進めます。
このadd(1)
の値はProgress
のcur
属性に加算されます。
Progress
はend
とcur
属性から現在の進捗を計算します。
cur
の値が増えれば進捗がそれだけ進むということになります。
time.sleep(0.1)
上記はスレッドをスリープしています。
これはアニメーションを見せるための意味のないスリープです。
取っちゃってもかまいません。
Progressクラスの解説
ではProgress
クラスの解説に入ります。
class Progress:
def __init__(self, end=100, cur=0, width=50):
self.end = end
self.cur = cur
self.width = width
def print(self):
n = int(self.width * (self.cur / self.end))
nn = self.width - n
n100 = int(100 * (self.cur / self.end))
s = '[' + n * '#' + nn * ' ' + '] ' + str(n100) + '%'
print(f'\r{s}', end='')
def add(self, n):
self.cur += n
def is_end(self):
return self.cur >= self.end
まずイニシャライザです。
def __init__(self, end=100, cur=0, width=50):
self.end = end
self.cur = cur
self.width = width
上記のend
は全体の仕事総量、cur
は現在の完了した仕事量、width
は表示を整えるための横幅です。
width
はデフォルトで50
になっていますが、これを100
にすると進捗バーの横幅が横に伸び、20
にするとバーが短くなります。
def print(self):
n = int(self.width * (self.cur / self.end))
nn = self.width - n
n100 = int(100 * (self.cur / self.end))
s = '[' + n * '#' + nn * ' ' + '] ' + str(n100) + '%'
print(f'\r{s}', end='')
上記は進捗バーを表示しているメソッドです。
まずself.cur / self.end
で現在の仕事量の全体の総量に対する割合を計算します。
これは0
から1
の値の範囲におさまります。
それにself.width
を掛けることでn
とします。
nn = self.width - n
でwidth
とn
の差分を取ります。これはバーの空白部分を埋めるための値です。
n * '#'
とすることで進捗バーの進捗部分が埋まり、nn * ' '
とすることで空白が埋まります。
n100 = int(100 * (self.cur / self.end))
はパーセンテージを計算しています。
割合に100
を書けると0
から100
までのパーセンテージになります。
あとはs = '[' + n * '#' + nn * ' ' + '] ' + str(n100) + '%'
で文字列を合成します。
これが進捗バーになります。
print(f'\r{s}', end='')
とやって文字列をprint()
します。
この時に\r
で出力一を行頭に戻しています。かつそれに加えてend=''
とやって改行を除いています。
こうするとアニメーションするような見た目になります。
def add(self, n):
self.cur += n
上記はself.cur
に進捗を加えるメソッドです。
加算してるだけです。
def is_end(self):
return self.cur >= self.end
上記は進捗が完了しているかどうかチェックするメソッドです。
self.cur
がself.end
以上であれば進捗完了と見なしTrue
を返します。
おわりに
今回はPythonで自作プログレスバーを作ってみました。
なにか参考になれば幸いです。
🦝 < 進捗進捗ぅ!
🦝 < ひえ~