Python 入門

ホーム > Tkinter による GUI プログラミング > プログレスバーの使い方

プログレスバーの使い方

時間のかかる作業を行う場合に、その進捗をユーザーに示すのがプログレスバーの役割です。

プログレスバーには確定的 (determinate) なプログレスバーと、不確定的 (indeterminate) なプログレスバーの二種類があります。

確定的なプログレスバーでは、最大の値が例えば 100 で、現在の進捗が 20 だから、20% の長さを表示するというやり方です。

プログレスバーが徐々に伸びていき、最後まで伸びたら作業が終了する、というタイプです。

一方、不確定的なプログレスバーでは、作業の終了タイミングが不確定でいつ作業が終わるか分からない。だけど、とりあえず何か作業しているので待ってくださいね、ということをユーザーに示します。 例えば作業中に環境の状態をチェックして、場合によってはアップデートをダウンロードしてインストールするかもしれないし、しないかもしれない、など、不確定な要素が入り込む場合があるときに使います。

この場合はプログレスバーは右へ、左へ動き回ります。

tkinter ではこれらは modedeterminate とすれば確定的、 indeterminate を指定すれば不確定的なプログレスバーを作成できます。

from tkinter import *
from tkinter import ttk

pbval = 0

def button_click():
    global pbval
    pbval = pbval + 1
    pb.configure(value=pbval)
    
def button2_click():
    pb2.stop()
    
if __name__ == '__main__':
    
    root = Tk()
    root.title('Progress')
    root.columnconfigure(0, weight=1);
    root.rowconfigure(0, weight=1);
    
    # Frame
    frame1 = ttk.Frame(root, padding=10)
    frame1.grid(sticky=(N,W,S,E))
    frame1.columnconfigure(0, weight=1);
    frame1.rowconfigure(0, weight=1);
    
    # プログレスバー (確定的)
    pb = ttk.Progressbar(
        frame1, 
        orient=HORIZONTAL, 
        length=200, 
        mode='determinate')
    pb.configure(maximum=10, value=pbval)
    pb.grid(row=0, column=0, sticky=(N,E,S,W))

    # 進捗ボタン
    button1 = ttk.Button(frame1, text='OK', command=button_click)
    button1.grid(row=0, column=1, padx=5, sticky=(E))
    
    # プログレスバー (不確定的)
    pb2 = ttk.Progressbar(
        frame1, 
        orient=HORIZONTAL, 
        length=200, 
        mode='indeterminate')
    pb2.configure(maximum=10, value=0)
    pb2.grid(row=1, column=0, sticky=(N,E,S,W))
    pb2.start(100)

    # 停止ボタン
    button2 = ttk.Button(frame1, text='Stop', command=button2_click)
    button2.grid(row=1,column=1,padx=5,sticky=(E))
    
    root.mainloop()

上記のコードでは上側のプログレスバーが確定的で、下のプログレスバーが不確定的なプログレスバーにしています。

ttk.Progressbar でプログレスバーを作成するときに mode を指定しています。

最大値や現在の値を設定するのは configure で構成します。configure で value=値 とか maximum=最大値 として、 進捗があり次第再度 configure で value を更新します。

今回はプログレスバーの進捗は pbval というグローバル変数を使って保持しています。関数の中で global を指定してアクセスしています。

不確定的なプログレスバーについては、start メソッドに、バーを動かす間隔を指定することで動作を開始します。 停止するには stop メソッドを呼びます。

ホーム > Tkinter による GUI プログラミング > プログレスバーの使い方