KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
Tkinterで使われるprogressbarとは?コードを用いて徹底解説!?

Tkinterで使われるprogressbarとは?コードを用いて徹底解説!?

今回はTkinterで使われるprogressbarに関して、コードを用いて徹底解説いたします。progressbarに関して知りたい、コードを通して学びを深めたい方へおすすめです。ぜひ最後までご確認ください。

目次
  1. そもそもTkinterで使われるprogressbarとは?
    1. Tkinterの構成要素
  2. progressbarで用意される2種類のmode
  3. 下準備
  4. Tkinterで活用されるprogressbar Widgetの定義
    1. orient
    2. length
    3. mode
    4. value
    5. variable
    6. maximum
    7. cursor
  5. テーマ(名前)を利用して、progressbar Widgetの外観を変更
  6. progressbarで活用される3種類の関数
    1. start
    2. stop
    3. step
  7. まとめ
  8. 参考文献
目次を開く⬇︎

そもそもTkinterで使われるprogressbarとは?

Tkinterで活用するprogressbarとは、Widgetの一種でファイルのダウンロード状況やタスクの進捗などを視覚化するものを意味します。

別名progressbar Widget, プログレスバーと呼ばれます。

普段聞き慣れない言葉が出てきて少し難しいですね。。以下の「Tkinterの構成要素」を確認しながら、理解を深めましょう。

Tkinterの構成要素

Tkinterの構成要素として、Window, Frame, Widgetの概念が存在します。

名称説明文
Window  画像のオレンジ色枠の部分になります。Tkinter画面全体を表します。
Frame画像内の水色枠部分になります。Widgetが1つ以上ある場合に、取りまとめるものです。
Widget黄緑色枠で囲まれる部分になります。1つの機能を持つ最小単位 = Widgetと考えると良いでしょう。

前の章でTkinterで利用するprogressbarとは、Widgetの一種でファイルのダウンロード状況やタスクの進捗などを視覚化するものとお伝えしました。

「Tkinterの構成要素」の画像内では、黄緑色枠に該当するWidgetに対して、編集することになります。

progressbarで用意される2種類のmode

progressbarでは2種類のmodeが用意されています。

それぞれdeterminate(確定的)modeindeterminate(非確定的)modeと呼びます。

determinate(確定的)mode、indeterminate(非確定的)modeでは、バーの動きに関して違いがあります。

以下の画像をご確認ください。

determinate(確定的)modeでは、バーが左から右へ移動して、右側へ到達すると終了しますが、indeterminate(非確定的)modeでは、バーが左から右へ移動して、右側へ到達すると、続けて右から左へバーの移動を行い、バーの移動を繰り返します。

下準備

今回は先ほど紹介した「Tkinterの構成要素」の画像を元に、progressbarの使い方をお伝えします。

下にコードを貼り付けておきますので、画像と見比べながら、コードを確認してみてください。できれば、一緒にprogressbarを体験しましょう。

1import tkinter as tk
2from tkinter import ttk
3
4class Application(tk.Frame):
5    def __init__(self, master=None):
6        # Windowの初期設定を行う。
7        super().__init__(master)
8
9        # Windowの画面サイズを設定する。
10        # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
11        self.master.geometry("300x200")
12
13        # Windowを親要素として、frame Widget(Frame)を作成する。
14        # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
15        frame = tk.Frame(self.master)
16
17        # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
18        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
19        frame.pack()
20
21        # frame Widget(Frame)を親要素として、progressbar Widgetを作成する。
22        # length : progressbar Widgetの長さを設定
23        # value : バーの値の初期化。
24        progressbar = ttk.Progressbar(frame, length=100, value=50)
25
26        # frame Widget(Frame)を親要素とした場合に、progressbar Widgetをどのように配置するのか?
27        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
28        progressbar.pack()
29
30# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
31if __name__ == "__main__":
32    # Windowを生成する。
33    # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
34    root = tk.Tk()
35    app = Application(master=root)
36    # Windowをループさせて、継続的にWindow表示させる。
37    # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
38    app.mainloop()

上記のコードをPython環境で実行すると、「Tkinterの構成要素」で紹介した画像の結果が表示されます。

Tkinterで活用されるprogressbar Widgetの定義

progressbar Widgetは、

1from tkinter import ttk
2
3ttk.Progressbar(option1, option2, ...) or ttk.Progressbar('親要素', option1, option2, ...)

で定義されます。

progressbar Widgetで使われるoptionの種類としては

  • orient
  • length
  • mode
  • value
  • variable
  • maximum
  • cursor

があります。順番に見ていきましょう。

※ optionの種類一覧を調べたい場合は、以下のようにコードを記述してご確認ください。

1from tkinter import ttk
2
3# progressbarを生成する。
4progressbar = ttk.Progressbar()
5# progressbarに関するoptionの種類一覧を取得する。
6print(progressbar.keys())

orient

orient optionを利用すると、progressbar Widgetの表示方向を設定できます。

指定方法としては、tk.HORIZONTAL(水平方向、デフォルト), tk.VERTICAL(垂直方向)があります。

例えば下準備コードのprogressbar = ttk.Progressbar(frame, length=100, value=50)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# progressbar = ttk.Progressbar(frame, length=100, value=50)
3# progressbar.config(orient=tk.VERTICAL) or progressbar.configure(orient=tk.VERTICAL)
4##################################
5progressbar = ttk.Progressbar(frame, length=100, value=50, orient=tk.VERTICAL)

以下の画像のようにprogressbar Widgetを描画します。

length

length optionを利用すると、progressbar Widgetの長さを設定できます。

例えば下準備コードのprogressbar = ttk.Progressbar(frame, length=100, value=50)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# progressbar = ttk.Progressbar(frame, length=100, value=50)
3# progressbar.config(length=150) or progressbar.configure(length=150)
4##################################
5progressbar = ttk.Progressbar(frame, length=150, value=50)

以下の画像のようにprogressbar Widgetを描画します。

mode

mode optionを利用すると、progressbarで用意されるmodeを設定できます。

指定できる値としては、determinate(determinate(確定的)mode、デフォルト), indeterminate(indeterminate(非確定的)mode)があります。

例えば下準備コードのprogressbar = ttk.Progressbar(frame, length=100, value=50)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# progressbar = ttk.Progressbar(frame, length=100, value=50)
3# progressbar.config(mode='indeterminate') or progressbar.configure(mode='indeterminate')
4##################################
5progressbar = ttk.Progressbar(frame, length=100, value=50, mode='indeterminate')

以下の画像のようにprogressbar Widgetを、indeterminate(非確定的)modeへ変更します。

value

value optionを利用すると、バーの値の初期化を行います。

例えば下準備コードのprogressbar = ttk.Progressbar(frame, length=100, value=50)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# progressbar = ttk.Progressbar(frame, length=100, value=50)
3# progressbar.config(value=20) or progressbar.configure(value=20)
4##################################
5progressbar = ttk.Progressbar(frame, length=100, value=20)

以下の画像のようにprogressbar Widgetを描画します。

variable

variable optionを利用すると、現在のバーの値を、変数として扱うことが可能になります。

例えば下準備コードを以下のように変更して、

1class Application(tk.Frame):
2+    # progressbar Widgetの現在のバーの値を格納する変数
3+    var = None
4
5+    # ボタンを選択した場合に実行する関数
6+    def checkBarValue(self):
7+         # progressbar Widgetの現在のバーの値を取得する。
8+         print(self.var.get())
9
10     def __init__(self, master=None):
11          ...
12
13+         # progressbar Widgetの現在のバーの値をint型の変数とする。
14+         # IntVarについて : https://kuroro.blog/python/K53voPjJuKFfYrjmP8FP/      
15+         self.var = tk.IntVar()
16+         # progressvar Widgetの現在のバーの値の初期化を行う。20とする。
17+         self.var.set(20)
18
19-         progressbar = ttk.Progressbar(frame, length=100, value=50)
20+         # variable : 現在のバーの値を、変数として設定する。可変なself.varとする。
21+         progressbar = ttk.Progressbar(frame, length=100, variable=self.var)
22    
23          progressbar.pack()
24
25+         # frame Widget(Frame)を親要素として、button Widgetを作成する。
26+         # text : テキスト情報
27+         # command : ボタンを選択した場合に、実行される関数の設定。self.checkBarValueとする。
28+         # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/
29+         button = tk.Button(frame, text='現在のバーの値を確認する', command=self.checkBarValue)
30+         # frame Widget(Frame)を親要素として、button Widgetをどのように配置するのか?
31+         # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
32+         button.pack()

「現在のバーの値を確認する」ボタンを選択すると、以下の画像のように、現在のバーの値を取得できます。

IntVar()に関しては、Tkinterで使われるWidget変数とは?StringVarを中心に解説!?の「IntVar」箇所でまとめていますので、詳しく知りたい方は是非ご確認ください。

maximum

maximum optionを利用すると、バーの値の最大値を設定できます。

例えば下準備コードのprogressbar = ttk.Progressbar(frame, length=100, value=50)箇所を、以下のように変更すると、

1# 別解法 ##########################
2# progressbar = ttk.Progressbar(frame, length=100, value=50)
3# progressbar.config(maximum=80) or progressbar.configure(maximum=80)
4##################################
5# maximum : バーの値の最大値の設定。デフォルト100。
6progressbar = ttk.Progressbar(frame, length=100, value=50, maximum=80)

以下の画像のようにprogressbar Widgetを描画します。

cursor

cursor optionを利用すると、progressbar Widget内へマウスカーソルを移動すると矢印の見た目を変化します。

見た目のバリエーションについてはこちらのサイトにまとまっていますので、ご確認ください。

例えば下準備コードのprogressbar = ttk.Progressbar(frame, length=100, value=50)箇所を、以下のように変更して、

1# 別解法 ##########################
2# progressbar = ttk.Progressbar(frame, length=100, value=50)
3# progressbar.config(cursor="clock") or progressbar.configure(cursor="clock")
4##################################
5progressbar = ttk.Progressbar(frame, length=100, value=50, cursor="clock")

progressbar Widget内へマウスカーソルを移動すると、矢印の見た目が変更します。

テーマ(名前)を利用して、progressbar Widgetの外観を変更

ttk.Progressbar()では、テーマ(名前)を指定することで、progressbar Widgetの外観を変更できます。

例えば以下のようなコードを作成すると、

1import tkinter as tk
2from tkinter import ttk
3
4class Application(tk.Frame):
5    def __init__(self, master=None):
6        # Windowの初期設定を行う。
7        super().__init__(master)
8
9        # Windowの画面サイズを設定する。
10        # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
11        self.master.geometry("300x200")
12
13        # Windowを親要素として、frame Widget(Frame)を作成する。
14        # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
15        frame = tk.Frame(self.master)
16
17        # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
18        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
19        frame.pack()
20
21        # ttk.Progressbar()の外観を変更
22        style = ttk.Style()
23        # テーマ(名前)の指定を行う。
24        style.theme_use('classic')
25
26        # frame Widget(Frame)を親要素として、progressbar Widgetを作成する。
27        # length : progressbar Widgetの長さを設定
28        # value : バーの値の初期化。
29        progressbar = ttk.Progressbar(frame, length=100, value=50)
30
31        # frame Widget(Frame)を親要素とした場合に、progressbar Widgetをどのように配置するのか?
32        # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
33        progressbar.pack()
34
35# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
36if __name__ == "__main__":
37    # Windowを生成する。
38    # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
39    root = tk.Tk()
40    app = Application(master=root)
41    # Windowをループさせて、継続的にWindow表示させる。
42    # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
43    app.mainloop()

以下の画像のように、progressbar Widgetを描画します。

また現在利用中のテーマ(名前)を確認する場合は、

1from tkinter import ttk
2
3style = ttk.Style()
4# 現在利用中のテーマ(名前)を確認
5currentTheme = style.theme_use() 
6print(currentTheme)

利用できるテーマ(名前)の一覧を確認する場合は、

1from tkinter import ttk
2
3style = ttk.Style() 
4# テーマ(名前)の一覧を確認
5allTheme = style.theme_names() 
6print(allTheme)

テーマ(名前)の指定を行う場合は、

1from tkinter import ttk
2
3style = ttk.Style()
4# テーマ(名前)の指定を行う。
5style.theme_use('テーマ(名前)') 

をご利用ください。

progressbarで活用される3種類の関数

progressbarで活用される関数として、

  • start
  • stop
  • step

の3種類が存在します。順に見ていきましょう。

start

start関数を利用すると、一定時間(ミリ秒で設定)ごとに、バーの値を+1自動更新できます。

1# 第一引数 : 一定時間(ミリ秒で設定。正の整数)。デフォルトとして50(50ミリ秒ごとに、バーの値を+1自動更新する)が設定される。
2.start(一定時間)

で定義されます。戻り値はありません。

例えば下準備コードのprogressbar = ttk.Progressbar(frame, length=100, value=50)の下へ、以下のコードを記述すると、

1def __init__(self, master=None):
2    ...
3    progressbar = ttk.Progressbar(frame, length=100, value=50)
4
5+   # 第一引数 : 一定時間(ミリ秒で設定。正の整数)。100ミリ秒ごとに、バーの値を+1自動更新する。
6+   progressbar.start(100)

100ミリ秒ごとに、バーの値を+1自動更新します。

stop

stop関数を利用すると、バーの値の自動更新(start関数)を停止できます。

1.stop()

で定義されます。戻り値はありません。

例えば下準備コードのprogressbar.pack()の下へ、以下のコードを記述すると、

1def __init__(self, master=None):
2    ...
3    progressbar = ttk.Progressbar(frame, length=100, value=50)
4    progressbar.pack()
5
6+   # 第一引数 : 一定時間(ミリ秒で設定。正の整数)。100ミリ秒ごとに、バーの値を+1自動更新する。
7+   progressbar.start(100)
8
9+   # frame Widget(Frame)を親要素として、button Widgetを作成する。
10+   # text : テキスト情報
11+   # command : ボタンを選択した場合に、実行する関数を設定。progressbar.stop()とする。
12+   # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/
13+   button = tk.Button(frame, text='停止する', command=lambda: progressbar.stop())
14+   # frame Widget(Frame)を親要素として、button Widgetをどのように配置するのか?
15+   # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
16+   button.pack()

以下の画像のようにprogressbar Widgetを描画して、「停止する」ボタンを選択すると、バーの値の自動更新(start関数)を停止できます。

step

step関数を利用すると、バーの値に指定する値を加算できます。

1# 第一引数(任意) : 指定する値。(指定する値を設定しない場合、バーの値へ1が加算される。)
2.step('指定する値')

で定義されます。戻り値はありません。

例えば下準備コードのprogressbar = ttk.Progressbar(frame, length=100, value=50)の下へ、以下のコードを記述すると、

1def __init__(self, master=None):
2    ...
3    progressbar = ttk.Progressbar(frame, length=100, value=50)
4
5+   # 第一引数(任意) : 指定する値。(指定する値を設定しない場合、バーの値へ1が加算される。)
6+   progressbar.step(20)

バーの値に20を加算して、バーの値を70(50 + 20)へ変更します。

まとめ

  • Tkinterで活用するprogressbarとは、Widgetの一種でファイルのダウンロード状況やタスクの進捗などを視覚化するものを意味します。
  • 別名progressbar Widget, プログレスバーと呼ばれる。
  • Tkinterの構成要素として、Window, Frame, Widgetの概念が存在します。

参考文献