Tkinterで使われるprogressbarとは?コードを用いて徹底解説!?
今回はTkinterで使われるprogressbarに関して、コードを用いて徹底解説いたします。progressbarに関して知りたい、コードを通して学びを深めたい方へおすすめです。ぜひ最後までご確認ください。
- そもそもTkinterで使われるprogressbarとは?
- progressbarで用意される2種類のmode
- 下準備
- Tkinterで活用されるprogressbar Widgetの定義
- テーマ(名前)を利用して、progressbar Widgetの外観を変更
- progressbarで活用される3種類の関数
- まとめ
- 参考文献
執筆者 - おすすめの記事3選
そもそも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(確定的)mode、indeterminate(非確定的)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の概念が存在します。