GUI

Python Tkinter widgets 発展的なウィジェット(14) Progressbar

プログレスバーウィジェットは、操作の進行状況をユーザーにフィードバックするもの。

操作の完了までにかかる時間が予測できる場合、すでに完了した部分を表示することができる。そうでない場合は、操作が続いていることを示すことができるが、どのくらい時間がかかるかを示すことはできない。

p = ttk.Progressbar(parent, orient=HORIZONTAL, length=100, mode='determinate')

スケールウィジェットと同様に、orient設定オプションで向き(水平または垂直)を指定する必要があり、オプションで長さを指定することができる。mode設定オプションは、プログレスバーが完了までの相対的な進捗を示すdeterminateか、相対的な進捗を示さずに操作がまだ続いていることを示すindeterminateのいずれかに設定できる。

進捗状況の把握

determinateを使うには、操作が完了するまでにかかる「ステップ」の総数を見積もる。これは時間でも良いが、その必要はない。この値をprogressbarのmax設定オプションで指定する。これは浮動小数点数で、デフォルトは100.0(よって各ステップは1%)。

操作を進めながら、progressbarにvalue設定オプションでどこまで進んだかを知らせる。これは0から始まり、設定した最大値までカウントアップすることになる。

進捗の不定期化

indeterminateは、長時間実行されるタスクが実際にどの程度進んでいるのか容易に推定できない場合に使用する。操作が続いていること(そしてプログラムがクラッシュしていないこと)のフィードバックは欲しい場合がある。操作の開始時に、プログレスバーの start メソッドを呼び出す。操作の終了時には、stopメソッドを呼び出す。

ただし、それほど単純なことではない。プログレスバーを起動し、数分かかる関数を呼び出してからプログレスバーを停止すると、プログレスバーが更新されないまま、プログラムがずっとフリーズしているように見える。それどころか、画面上に全く表示されなくなる可能性もある。(この詳細はイベントループで説明する)