Tkinter ttk.Progressbar

Tkinter ttk.Progressbar とは?

Tkinter ttk.Progressbar は、時間のかかる作業などの進捗状況をユーザーに示すためのウィジェットです。

Tkinter progressbar demo

ttk.Progressbar プログレスバーには確定的 (determinate) なプログレスバーと、不確定的 (indeterminate) なプログレスバーの二種類があります。これは mode オプションで設定できます。

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

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

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

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

ただし Tk テーマ付きウィジェットの常として、設定されているテーマによっては表示が異なります。Mac でのデフォルトの aqua テーマでは不確定的なプログレスバーは動いているのか動いていないのかやや見難いようです。

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

Tkinter ttk.Progressbar のオプション

ttk.Progressbar ウィジェットの標準オプション

ttk.Progressbar ウィジェットでは次の標準オプションが利用できます。

  • cursor
  • style
  • takefocus

ttk.Progressbar ウィジェットの length オプション

ttk.Progressbar ウィジェットの length オプションはプログレスバーの長さを指定します。「長さ」は horizontal の場合は幅を表し、 vertical の場合は高さを表ます。

ttk.Progressbar ウィジェットの maximum オプション

ttk.Progressbar ウィジェットの maximum オプションは value の最大値を指定します。既定値は 100 です。

ttk.Progressbar ウィジェットの mode オプション

ttk.Progressbar ウィジェットの mode オプションはモードを指定します。有効な値は determinate と indeterminate です。

ttk.Progressbar ウィジェットの orient オプション

ttk.Progressbar ウィジェットの orient オプションはプログレスバーの向きを指定します。有効な値は horizontal と vertical です。

ttk.Progressbar ウィジェットの value オプション

ttk.Progressbar ウィジェットの value オプションはプログレスバーの値を指定します。

ttk.Progressbar ウィジェットの variable オプション

ttk.Progressbar ウィジェットの variable オプションは value を設定するグローバル変数を指定します。変数を指定した場合、 その変数の値を変更すると、自動的に value の値も変わります。

Tkinter ttk.Progressbar のスタイル

ttk.Progressbar のスタイルクラス名は TProgressbar です。

TProgressbar では次のオプションが指定できます。

  • background
  • bordercolor
  • darkcolor
  • lightcolor
  • troughcolor

Tkinter ttk.Progressbar のサンプルコード

Tkinter ttk.Progressbar を使った簡単なサンプルコードを紹介します。

Tkinter progressbar demo

上側のプログレスバーが確定的 (determinate) で、下のプログレスバーが不確定的な (indeterminate) プログレスバーにしています。

from tkinter import *
from tkinter import ttk

def button_click():
    pbval.set(pbval.get() + 1)
    if pbval.get() > 10:
        pbval.set(0)

if __name__ == '__main__':
    root = Tk()
    ttk.Style().theme_use('classic')
    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);

    # プログレスバー (確定的)
    pbval = IntVar(value=3)
    pb = ttk.Progressbar(
        frame1,
        orient=HORIZONTAL,
        variable=pbval,
        maximum=10,
        length=200,
        mode='determinate')
    pb.grid(row=0, column=0, sticky=(N, E, S, W))

    # 進捗ボタン
    button1 = ttk.Button(
        frame1, text='OK', width=5,
        command=button_click)
    button1.grid(row=0, column=1, padx=5, sticky=(E))

    # プログレスバー (不確定的)
    pb2 = ttk.Progressbar(
        frame1,
        orient=HORIZONTAL,
        maximum=10,
        value=0,
        length=200,
        mode='indeterminate')
    pb2.grid(row=1, column=0, sticky=(N, E, S, W))
    pb2.start(100)

    # 停止ボタン
    button2 = ttk.Button(
        frame1, text='Stop', width=5,
        command=lambda: pb2.stop())
    button2.grid(row=1, column=1, padx=5, sticky=(E))

    root.mainloop()

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

プログレスバーの値は pbval という名前のグローバル変数を作成して、 ttk.Progressbarvariable オプションにセットしています。

OK ボタンをクリックした時に、グローバル変数の値を増やすことで、自動的にプログレスバーの値も変わります。これによって、バーの長さが変わります。

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

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門