tkinter.ttkで利用できる、Progressbarの使い方を、実際にコードを書きながらまとめました。
目次
Progressbarの概要
Progressbarは、処理の進捗状況を可視化するためのウィジェットです。
アプリ内で何かしら時間のかかる処理をしていることを知らせるときや、あとどのくらいで処理が完了するかを視覚化することができます。
以下に、ttkで生成したProgressbarの外観を示します。

この例では、プログレスバーが左右に動いて、現在処理中であることを示しています。
プログレスバーには、以下の2種類があります。
- ユーザーに処理中であることを視覚的に伝える
- ユーザーに処理の進捗度を視覚的に伝える
似たような内容ですが、1は処理がいつ終わるのか不明だが、ユーザーに処理中であることを伝えるため、2は処理が完了するタイミングが明確で、現在どこまで来ているかをユーザーに伝えるためのアプリになります。
前者が非確定的(indeterminate)、後者が確定的(determinate)と呼ばれいて、「code」オプションを用いて設定することが可能です。
それぞれについて、実際に簡単なアプリを作成して使い方を確認していきます。
アプリ概要(非確定的)
まずは、非確定的プログレスバーを用いて、スタートボタンを押すとバーが動き出し、ストップボタンで停止させるようにします。
まずは、完成したアプリの起動時の画面を示します。

上からプログレスバー、スタートボタン、ストップボタンが並んでいます。
スタートボタンを押すと、プログレスバーの緑の部分が左右に動き、処理中であることを示します。
これはストップボタンを押すまで止まりません。
コードの解説(非確定的)
まずはモジュールのインポートです。
tkinterとttkをインポートしましょう。
import tkinter from tkinter import ttk
次に、プログレスバーとボタン二つを生成するクラス「TestProgressbar」を作成します。
「TestProgressbar」クラスには、ラベルフレームを継承させています。
class TestProgressbar(ttk.LabelFrame): def __init__(self, master=None): super().__init__(master, text="Progressbar") #progressbar self.progress = ttk.Progressbar(self) self.progress.configure( value=0, mode='indeterminate', maximum=100 ) self.progress.pack() #start button self.start_button = ttk.Button(self, command=self.startbar, text='start!') self.start_button.pack() #stop button self.stop_button = ttk.Button(self, command=self.stopbar, text='stop!') self.stop_button.pack() def startbar(self): self.progress.start(interval=10) def stopbar(self): self.progress.stop()
このうち、以下の箇所がProgressbarに関するコードです。
#progressbar self.progress = ttk.Progressbar(self) #1 self.progress.configure( #2 value=0, mode='indeterminate', maximum=100 ) self.progress.pack()
次に、スタートボタンを押したときに実行される、startbar
メソッドを見ていきます。
def startbar(self): self.progress.start(interval=10)
self.progress.start(interval=10)
はプログレスバーを起動させるコマンドです。
オプションinterval
はバーの動くスピードを設定するパラメーターで、interval=10
では10msecごとに「value」を1増やしていきます。
デフォルトではinterval=50
です。数字を減らすと早くなり、増やすと遅くなるので、適切に調整しましょう。
最後に、ストップボタンを押したときに実行されるstopbar
メソッドです。
def stopbar(self): self.progress.stop()
ここでは、self.progress.stop()
を実行してProgressbarを停止させています。
最後に上記クラスのオブジェクトを生成して完成です。
if __name__ == "__main__": root = tkinter.Tk() f = TestProgressbar(master=root) f.pack() root.mainloop()
アプリ概要(確定的)
次は確定的プログレスバーを用いて、スタートボタンを押すとバーが動き出し、バーが右端に到達すると停止するアプリを作成します。
完成したアプリの起動時の画面を示します。

今回は、進捗がmaxになると自動で止まるため、ストップボタンはありません。
スタートボタンを押すと、プログレスバーが動き出して、右側端に到達すると停止します。

コードの解説(確定的)
基本的には1と同じなので、変更点のみを記載します。
まず、進捗を表現するために、timeモジュールのsleep機能を使いたいので、timeモジュールを追加でインポートしてください。
import tkinter from tkinter import ttk import time #追加
次に、プログレスバーの「mode」オプションを「determinate」に修正します。
self.progress.configure( value=0, mode='determinate', #修正 maximum=100 )
最後はstartbar
メソッドの修正です。
def startbar(self): i = 1 while i <= 100: self.progress.configure(value=i) self.progress.update() i = i + 1 time.sleep(0.02)
whileループを使ってvalueを1から100まで1ずつ増やしていくことで、Progressbarを進めていきます。
但し、self.progress.update()
を入れないと、画面の更新がされないので必ず入れてください。
また、そのままでは一瞬で終わってしまうので、time.sleep(0.02)
を入れてゆっくりProgressbarが進むようにしています。
コード全文
1 非確定的プログレスバー
import tkinter from tkinter import ttk class TestProgressbar(ttk.LabelFrame): def __init__(self, master=None): super().__init__(master, text="Progressbar") #progressbar self.progress = ttk.Progressbar(self) self.progress.configure( value=0, mode='indeterminate', maximum=100 ) self.progress.pack() #start button self.start_button = ttk.Button(self, command=self.startbar, text='start!') self.start_button.pack() #stop button self.stop_button = ttk.Button(self, command=self.stopbar, text='stop!') self.stop_button.pack() def startbar(self): self.progress.start(interval=10) def stopbar(self): self.progress.stop() if __name__ == "__main__": root = tkinter.Tk() f = TestProgressbar(master=root) f.pack() root.mainloop()
2 確定的プログレスバー
import tkinter from tkinter import ttk import time class TestProgressbar(ttk.LabelFrame): def __init__(self, master=None): super().__init__(master, text="Progressbar") #progressbar self.progress = ttk.Progressbar(self) self.progress.configure( value=0, mode='determinate', maximum=100 ) self.progress.pack() #start button self.start_button = ttk.Button(self, command=self.startbar, text='start!') self.start_button.pack() def startbar(self): i = 1 while i <= 100: self.progress.configure(value=i) self.progress.update() i = i + 1 time.sleep(0.02) if __name__ == "__main__": root = tkinter.Tk() f = TestProgressbar(master=root) f.pack() root.mainloop()