処理に時間がかかるプログラムを実行しているとき、どれくらい進んでいるか気になりますよね。
今回はプログラムの進捗状況を可視化できるように、処理中にプログレスバーを表示する方法を紹介します。
サンプルコードはこちらです。
from tkinter import ttk
import tkinter, time
tk = tkinter
window = tk.Tk()
window.geometry('400x150')
window.title("Progress")
label1 = tk.Label(window, text='determinate', font = ('san serif', 10))
label1.pack()
progress1 = ttk.Progressbar(length=300) #決定的
progress1.pack()
label2 = tk.Label(window, text='indeterminate', font = ('san serif', 10))
label2.pack()
progress2 = ttk.Progressbar(length=300, mode='indeterminate', maximum=10) #非決定的
progress2.pack()
for i in range(0, 100):
progress1.configure(value=i)
progress2.configure(value=i)
window.update()
time.sleep(0.1)
目次
実装方法
プログレスバーを表示する方法としては、コンソールに/を表示するような方法もありますが、今回はGUIを使用する方法を紹介します。
使うモジュールはtkinterです。インストールされていない方は以下のようにインストールしてください。
pip install tkinter
流れとしては
- プログレスバーを表示するウィンドウを作る
- プログレスバーを描画する
といった感じになります。
まずはウィンドウを作ります。
import tkinter
window = tkinter.Tk() #ウィンドウを作成
window.geometry('400x150') #大きさを指定
window.title("Progress") #タイトルを作成
ウィンドウの大きさやタイトルの指定は必須ではありません。
作成したウィンドウにプログレスバーを描画します。
from tkinter import ttk
progress = ttk.Progressbar()
Progressbar()メソッドに引数を指定しなければ、自動で生成済みのウィンドウにプログレスバーが描画されます。
使い道が把握できていないオプションもありますが、主に使うオプションはこのあたりではないでしょうか。
orient
バーの向きを”horizontal” か”vertical”で決定します。
デフォルトでは横向き(“horizontal”)です。
length
プログレスバーの長さを決めます。Pythonの公式ドキュメントには記載が見当たりませんでしたが、単位はおそらくピクセルです。
orientに”horizontal”を指定した場合は幅、”vertical”を指定した場合は高さです。
value
mode = ‘determinate’の時は処理の進み具合になります。繰り返し処理等で更新することでバーを進めることができます。
mode = ‘indeterminate’の時は、Pythonの公式ドキュメントに以下のように書かれています。
非決定的 (“indeterminate”) モードでは、 maximum を法として解釈され、値が maximum に達したときにプログレスバーは 1 “サイクル” を完了したことになります。
https://docs.python.org/ja/dev/library/tkinter.ttk.html#tkinter.ttk.Progressbarより引用
要するにvalueをmaximumで割った数がバーの進捗になっているということだと思われます。
バーが端から端まで行ったら1サイクルのようです。左→右→左で2サイクルです。
mode
決定的 (“determinate”)か非決定的 (“indeterminate”)で指定します。
分かりづらい表現ですが、進捗がわかるバーを表示するか、実行中ということだけがわかるバーかということです。
こちらに参考の動画を載せておきます。
バーの表示の更新はmainloop()メソッドやupdate()メソッドで行います。
GUIで何か受け付けを待っている場合はmainloop()メソッドでループを回してください。処理の進み具合に応じてバーを更新したい場合は、処理の合間でvalueを更新した後、update()でバーを進めてください。
for i in range(0, 100):
progress1.configure(value=i)
window.update()
time.sleep(0.1)
maximum
バーの最大値を決めます。サンプルコードの非決定的なバーの最大値を10にすることで、forが100回ループする間にバーが10回動くように設定しています。
progress2 = ttk.Progressbar(length=300, mode='indeterminate', maximum=10) #非決定的
progress2.pack()
progress2.start()
for i in range(0, 100):
print('test')
progress1.configure(value=i)
window.update()
time.sleep(0.1)
デザインの変更
プログレスバーのデザインはある程度変更可能なようです。
ウィンドウの背景色等も変更可能なようですが、手軽な方法としてテーマを設定する方法紹介します。
以下のようにテーマを指定することで、プログレスバーの見た目を変更することができます。
style=ttk.Style()
style.theme_use('テーマ名')
テーマは以下のとおりです。
- alt
- aqua
- clam
- classic
- default
- vista
- winnative
- xpnative
また、ttkthemesというモジュールを使ってテーマを変えることも可能です。
詳細な見た目は公式ドキュメントを見ていただいたほうがわかりやすいかと思います。
使い方は簡単です。ttkthemesをインストールして、window = tk.Tk()でウィンドウを作っていたところをwindow = ThemedTk()とするだけです。
from ttkthemes import ThemedTk
# window = tk.Tk()
window = ThemedTk(theme='adapta')
テーマは以下のようなものがあるようです。今後増えたり減ったりするかもしれないのでテーマは公式ドキュメントを参照してください。
- Adapta
- Aquativo
- Arc
- Black
- Blue
- Breeze
- Clearlooks
- Elegance
- Equilux
- ITFT1
- Keramik
- Kroc
- Plastik
- Radiance
- Scid themes
- Smog
- winxpblue
- yaru
おわりに
今回は以上です。プログレスバーは無くても困らないけどあったら便利ですよね。簡単に実装できるのでぜひ実装してみてください。
コメントを残す