Tkinterで使われるoptionmenuとは?活用事例を交えて徹底解説!?
今回はTkinterで利用されるoptionmenuに関して、活用事例を交えて解説いたします。optionmenuの使い方がわからない、活用事例を通してoptionmenuを学びたい方へおすすめです。ぜひ最後までご覧ください。
- そもそもTkinterで使われるoptionmenuとは?
- Tkinterの構成要素
- 下準備
- Tkinterで活用されるopitonmenu Widgetの定義
- 選択した選択肢の値を取得する方法【2種類】
- まとめ
- 参考文献
執筆者 - おすすめの記事3選
そもそもTkinterで使われるoptionmenuとは?
Tkinterで活用するoptionmenuとは、Widgetの一種でoptionmenuを選択すると、様々な選択肢を表示する入れ物を意味します。
別名optionmenu Widgetと呼ばれます。
普段聞き慣れない言葉が出てきて少し難しいですね。。以下の「Tkinterの構成要素」を確認しながら、理解を深めましょう。
Tkinterの構成要素
Tkinterの構成要素として、Window, Frame, Widgetの概念が存在します。
名称 | 説明文 |
---|---|
Window | 画像における黄色枠の部分になります。Tkinter画面全体を表します。 |
Frame | 画像における赤色枠の部分になります。Widgetが1つ以上ある場合に、取りまとめるものです。 |
Widget | 水色枠の箇所をWidgetと呼びます。1つの機能を持つ最小単位 = Widgetと考えると良いでしょう。 |
前の章でTkinterで利用するoptionmenuとは、Widgetの一種でoptionmenuを選択すると、様々な選択肢を表示する入れ物とお伝えしました。
「Tkinterの構成要素」の画像内では、水色枠に該当するWidgetに対して、編集することになります。
Tkinterの構成要素を理解したところで、実際にoptionmenuの活用方法を理解していきましょう。
下準備
今回は先ほど紹介した「Tkinterの構成要素」の画像を元に、optionmenuの使い方をお伝えします。
下にコードを貼り付けておきますので、画像と見比べながら、コードを確認してみてください。できれば、一緒にoptionmenuを体験しましょう。
1import tkinter as tk
2
3class Application(tk.Frame):
4 # optionmenu Widget内の選択肢が選択された場合に、実行する関数
5 def getSelectedValue(self, value):
6 # 選択した選択肢の値を出力する。
7 print(value)
8
9 def __init__(self, master=None):
10 # Windowの初期設定を行う。
11 super().__init__(master)
12
13 # Windowの画面サイズを設定する。
14 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
15 self.master.geometry("300x200")
16
17 # Windowを親要素として、frame Widget(Frame)を作成する。
18 # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
19 frame = tk.Frame(self.master)
20 # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
21 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
22 frame.pack()
23
24 # 現在選択されているoptionmenu Widget内の選択肢の値を、文字列変数として扱う。
25 # StringVarについて : https://kuroro.blog/python/K53voPjJuKFfYrjmP8FP/
26 var = tk.StringVar()
27 # set() : 初期値としてaaaの選択肢を設定する。
28 var.set('aaa')
29
30 # frame Widget(Frame)を親要素として、optionmenu Widgetを作成する。
31 # var : 現在選択されている選択肢の値。文字列変数(var)として値を持たせることで、可変として扱う。
32 # 'aaa', 'bbb' : 選択肢1, 選択肢2
33 # command : optionmenu Widget内の選択肢が選択された場合に、実行する関数を設定。self.getSelectedValueとする。
34 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
35
36 # frame Widget(Frame)を親要素とした場合に、optionmenu Widgetをどのように配置するのか?
37 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
38 optionmenu.pack()
39
40# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
41if __name__ == "__main__":
42 # Windowを生成する。
43 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
44 root = tk.Tk()
45 app = Application(master=root)
46
47 # Windowをループさせて、継続的にWindow表示させる。
48 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
49 app.mainloop()
上記のコードをPython環境で実行すると、「Tkinterの構成要素」で紹介した画像の結果が表示されます。
Tkinterで活用されるopitonmenu Widgetの定義
optionmenu Widgetは、
1import tkinter as tk
2
3# 選択肢が単数の場合
4# 第一引数(必須) : 親要素
5# 第二引数(必須) : variable。現在選択されている選択肢の値
6# 第三引数(必須) : 選択肢
7# 第四引数(任意) : command option。optionmenu Widget内の選択肢を選択する場合に実行する関数を設定。
8tk.OptionMenu("親要素", "variable", "選択肢", command="関数名")
9
10# 選択肢が複数の場合
11# 第一引数(必須) : 親要素
12# 第二引数(必須) : variable。現在選択されている選択肢の値
13# ※ Nは4以上の整数
14# 第三引数〜第N引数(第四引数まで必須) : 選択肢1, 選択肢2, ...
15# 第(N + 1)引数(任意) : command option。optionmenu Widget内の選択肢を選択する場合に実行する関数を設定。
16tk.OptionMenu("親要素", "variable", "選択肢1", "選択肢2", ..., command="関数名")
で定義されます。
またoptionmenu Widgetには、いくつかのoptionが備えられています。optionを利用することで、optionmenu Widgetの背景色や大きさを変更できます。
optionmenu Widgetで使われるoptionの種類としては
- activeforeground
- background, bg
- height, width
- anchor
- bd, borderwidth
- bitmap
- cursor
- direction
- fg, foreground
- font
- image
- compound
- wraplength
- justify
- menu
- padx, pady
- relief
- state
- disabledforeground
があります。順番に見ていきましょう。
optionの種類一覧を調べたい場合は、以下のようにコードを記述してご確認ください。
1import tkinter as tk
2
3# Windowを生成する。
4# Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
5root = tk.Tk()
6
7# 現在選択されているoptionmenu Widget内の選択肢の値を、文字列変数として扱う。
8# StringVarについて : https://kuroro.blog/python/K53voPjJuKFfYrjmP8FP/
9var = tk.StringVar()
10
11optionmenu = tk.OptionMenu(root, var, 'aaa')
12
13print(optionmenu.keys())
activeforeground
activeforeground optionを利用すると、optionmenu Widgetを選択した時の文字列色を設定できます。
色に関しては、Tkinterの色の使い方とは?活用例から色の一覧をまとめて紹介!?で総括していますので、詳しく知りたい方は是非ご確認ください。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(activeforeground='red')
7+ optionmenu.config(activeforeground='red')
optionmenu Widgetを選択した際に、以下の画像のように描画します。
background, bg
background option, bg optionを利用すると、optionmenu Widgetの背景色を設定します。
backgroundとbg両方のoptionを用いて、値を設定した場合、後ろの引数に設定されるoptionが優先されます。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(bg='red')
7+ optionmenu.config(bg='red')
以下の画像のようにmenubutton Widgetを描画します。
height, width
height option, width optionを利用すると、それぞれoptionmenu Widgetの高さ・幅を設定できます。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(height=5, width=10, bg='red')
7+ optionmenu.config(height=5, width=10, bg='red')
以下の画像のようにoptionmenu Widgetを描画します。
anchor
anchor optionを利用すると、optionmenu Widgetで表示する文字列を、どこに配置するかを決定できます。
指定方法として
- tk.W : Westの略。左の真ん中へoptionmenu Widgetの文字列を配置する
- tk.N : Northの略。上の真ん中へoptionmenu Widgetの文字列を配置する
- tk.S : Southの略。下の真ん中へoptionmenu Widgetの文字列を配置する
- tk.E : Eastの略。右の真ん中へoptionmenu Widgetの文字列を配置する
- tk.NE : North Eastの略。右上へoptionmenu Widgetの文字列を配置する
- tk.NW : North Westの略。左上へoptionmenu Widgetの文字列を配置する
- tk.SW : South Westの略。左下へoptionmenu Widgetの文字列を配置する
- tk.SE : South Eastの略。右下へoptionmenu Widgetの文字列を配置する
- tk.CENTER : 中心の略。中心へoptionmenu Widgetの文字列を配置する
の9種類が存在します。デフォルトではtk.W
が設定されます。
anchorに関する値入力へ悩んだ方は、以下の画像を確認しながら、anchorの値を考えると良いでしょう。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(anchor=tk.NW, height=5, width=10, bg='red')
7+ optionmenu.config(anchor=tk.NW, height=5, width=10, bg='red')
以下の画像のようにoptionmenu Widgetを描画します。
bd, borderwidth
bd option, borderwidth optionを利用すると、optionmenu Widgetの枠の大きさを設定します。
bdとborderwidth両方のoptionを用いて、値を設定した場合、後ろの引数に設定されるoptionが優先されます。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(bd=15, bg='green')
7+ optionmenu.config(bd=15, bg='green')
以下の画像のようにoptionmenu Widgetを描画します。
bitmap
bitmap optionを利用すると、XBM形式の2値画像(白と黒のみで表現される画像)を、設定できます。
Tkinterでは標準でいくつかのbitmap画像を備えていて、
- error
- gray75
- gray50
- gray25
- gray12
- hourglass
- info
- questhead
- question
- warning
が存在します。上でリストされるbitmap画像の詳細を知りたい場合は、こちらのリンクを確認ください。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(bitmap="error")
7+ optionmenu.config(bitmap="error")
以下の画像のようにoptionmenu Widgetを描画します。
cursor
cursor optionを利用すると、optionmenu Widget内へマウスカーソルを移動すると矢印の見た目を変化できます。
見た目のバリエーションについてはこちらのサイトにまとまっていますので、ご確認ください。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述して、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(cursor="clock")
7+ optionmenu.config(cursor="clock")
optionmenu Widget内へマウスカーソルを移動すると、矢印の見た目が変更します。
direction
direction optionを利用すると、optionmenu Widget内で利用する選択肢の表示位置を設定できます。
指定方法としては、
- tk.LEFT : 左側
- tk.RIGHT : 右側
- 'above' : 上側
- 'below' : 下側(デフォルト)
の4種類あります。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(direction='above')
7+ optionmenu.config(direction='above')
以下の画像のようにoptionmenu Widgetを描画します。
fg, foreground
fg option, foreground optionを利用すると、文字列色を変更できます。
fgとforeground両方のoptionを用いて、値を設定した場合、後ろの引数に設定されるoptionが優先されます。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(fg='red')
7+ optionmenu.config(fg='red')
以下の画像のようにoptionmenu Widgetを描画します。
font
font optionを利用すると、文字の形式や大きさを変更できます。
fontに関しては、Tkinterで使われるフォントって?2種類のフォントの設定方法を丁寧に解説でまとめておりますので、詳しく知りたい方は是非ご確認ください。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # font option第一引数(必須) : 文字列の形式(デフォルトから変更しない)
7+ # font option第二引数(必須) : 文字列の大きさを設定。
8+ # font option第三引数(任意) : underline = 文字列へ下線をつける。
9+ # fontについて : https://kuroro.blog/python/RZNjLl36upkumxwkTRWl/
10+ # もしくはoptionmenu.configure(font=("", 20, "underline"))
11+ optionmenu.config(font=("", 20, "underline"))
以下の画像のようにoptionmenu Widgetを描画します。
image
image optionを利用すると、optionmenu Widgetへ画像を貼り付ける設定を行います。
例えば「下準備」コードを、以下のように変更すると、
1
2def __init__(self, master=None):
3 ...
4 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
5
6+ # 画像について : https://kuroro.blog/python/Z7k1LSyDyiDHtD5UCjmG/
7+ global image
8+ image = tk.PhotoImage(file="/{画像のパス}/{画像ファイル名}.{拡張子}")
9+ # もしくはoptionmenu.configure(image=image)
10+ optionmenu.config(image=image)
以下の画像のようにoptionmenu Widgetを描画します。
画像の取り扱いに関しては、【もう間違えない!?】PythonのTkinterを用いて画像を表示する方法でまとめましたので、うまく表示されない、サンプルコードを確認したい方はご確認ください。
compound
compound optionを利用すると、optionmenu Widgetへ画像を貼り付ける場合に、文字列をどこに貼り付けるのか設定できます。
指定方法として
- tk.LEFT : 文字列の左側へ画像を配置する
- tk.RIGHT : 文字列の右側へ画像を配置する
- tk.BOTTOM : 文字列の下側へ画像を配置する
- tk.TOP : 文字列の上側へ画像を配置する
- tk.CENTER : 画像の真ん中へ文字列を配置する
- tk.NONE : 文字列を表示しない(デフォルト)
の6種類が存在します。
例えば「下準備」コードを、以下のように変更すると、
1
2def __init__(self, master=None):
3 ...
4 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
5
6+ # 画像について : https://kuroro.blog/python/Z7k1LSyDyiDHtD5UCjmG/
7+ global image
8+ image = tk.PhotoImage(file="/{画像のパス}/{画像ファイル名}.{拡張子}")
9+ # もしくはoptionmenu.configure(image=image, compound=tk.LEFT)
10+ optionmenu.config(image=image, compound=tk.LEFT)
以下の画像のようにoptionmenu Widgetを描画します。
wraplength
wraplength optionを利用すると、optionmenu Widgetで利用する文字列の折り返し幅を設定できます。
例えば「下準備」コードを以下のように変更すると、
1
2def __init__(self, master=None):
3 ...
4
5- var.set('aaa')
6+ var.set('Select alphabetSelect alphabetSe')
7
8- optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
9+ optionmenu = tk.OptionMenu(frame, var, 'Select alphabetSelect alphabetSe', 'bbb', command=self.getSelectedValue)
10+ # もしくはoptionmenu.configure(wraplength=50)
11+ optionmenu.config(wraplength=50)
以下の画像のようにoptionmenu Widgetを描画します。
justify
justify optionを利用すると、optionmenu Widgetで利用する文字列をどちらに揃えるか設定できます。
指定方法としては、
- tk.LEFT : 左寄せ(デフォルト)
- tk.CENTER : 中央寄せ
- tk.RIGHT : 右寄せ
の3種類があります。
例えば「下準備」コードを以下のように変更すると、
1
2def __init__(self, master=None):
3 ...
4
5- var.set('aaa')
6+ var.set('Select alphabetSelect alphabetSe')
7
8- optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
9+ optionmenu = tk.OptionMenu(frame, var, 'Select alphabetSelect alphabetSe', 'bbb', command=self.getSelectedValue)
10+ # もしくはoptionmenu.configure(wraplength=50, justify=tk.RIGHT)
11+ optionmenu.config(wraplength=50, justify=tk.RIGHT)
以下の画像のようにoptionmenu Widgetを描画します。
menu
menu optionを利用すると、tk.OptionMenu()
で設定される、選択肢を丸ごと書き換えることができます。
例えば「下準備」コードを以下のように変更すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6
7+ # optionmenu Widgetを親要素として、menu Widgetを作成する。
8+ # tk.Menuについて : https://kuroro.blog/python/Dfq4VCJ7OiEfYJv6ySge/
9+ menu = tk.Menu(optionmenu)
10+ # menuへ選択肢を追加する。
11+ # label : 選択肢のテキスト。'A'とする。
12+ menu.add_command(label="A")
13+ # menuへ選択肢を追加する。
14+ # label : 選択肢のテキスト。'B'とする。
15+ menu.add_command(label="B")
16
17+ # もしくはoptionmenu.configure(menu=menu)
18+ optionmenu.config(menu=menu)
以下の画像のようにoptionmenu Widgetを描画します。
menu Widgetに関しては、もう間違えない!?Tkinterで使われるmenubarの作成手順を徹底解説!?でまとめておりますので、詳しく知りたい方は是非ご確認ください。
padx, pady
padx option, pady optionを利用すると、文字列の外側へ空白の幅を設定できます。
※ 2021年7月20日現在、筆者のMac OSではpadx option, pady optionを設定しても、optionmenuは変更されませんでした。
relief
relief optionを利用すると、optionmenu Widgetの枠のデザインを設定できます。
指定方法としては、
- tk.RAISED
- tk.SUNKEN
- tk.FLAT
- tk.RIDGE
- tk.GROOVE
- tk.SOLID
の6種類があります。
※ 2021年7月20日現在、筆者のMac OSではrelief optionを設定しても、optionmenuは変更されませんでした。
state
state optionを利用すると、optionmenu Widgetの状態を設定できます。
指定できる値としては、
- normal : optionmenuへの選択を有効。マウスカーソルがoptionmenu上に乗っていない状態を表す。デフォルト。
- disabled : optionmenuへの選択を無効。
- active : optionmenuへの選択を有効。マウスカーソルがoptionmenu上に乗っている状態を表す。
があります。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(state='disabled')
7+ optionmenu.config(state='disabled')
以下の画像のようにoptionmenu Widgetを選択できなくなります。
disabledforeground
disabledforeground optionを利用すると、optionmenu Widgetの状態(state)がdisabledの時の、文字列色を設定できます。
例えば「下準備」で紹介したoptionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
箇所下で、以下のようなコードを記述すると、
1
2def __init__(self, master=None):
3 ...
4
5 optionmenu = tk.OptionMenu(frame, var, 'aaa', 'bbb', command=self.getSelectedValue)
6+ # もしくはoptionmenu.configure(state='disabled', disabledforeground='red')
7+ optionmenu.config(state='disabled', disabledforeground='red')
以下の画像のようにoptionmenu Widgetを描画します。
選択した選択肢の値を取得する方法【2種類】
先ほどの「Tkinterで活用されるopitonmenu Widgetの定義」では、optionmenu Widgetの定義からoptionの種類に関して、徹底解説いたしました。
「選択した選択肢の値を取得する方法【2種類】」では、optionmenu Widget内の選択肢を選択するたびに、選択した選択肢の値を取得する方法をお伝えいたします。
選択した選択肢の値を取得する方法として、
- command optionを利用する
- trace関数を利用する
の2種類があります。使い方を順にみていきましょう。
command optionを利用する
command optionを利用すると、
- optionmenu Widget内の選択肢を選択する
- command optionで設定する関数が呼ばれる
- 選択した選択肢の値を取得
の流れで値を取得できます。
command optionは、
1# 選択肢が単数の場合
2# 第四引数(任意) : command option。optionmenu Widget内の選択肢を選択する場合に実行する関数を設定。
3tk.OptionMenu("親要素", "variable", "選択肢", command="関数名")
4
5# 選択肢が複数の場合
6# ※ Nは4以上の整数
7# 第(N + 1)引数(任意) : command option。optionmenu Widget内の選択肢を選択する場合に実行する関数を設定。
8tk.OptionMenu("親要素", "variable", "選択肢1", "選択肢2", ..., command="関数名")
で定義されます。
例えば「下準備」で紹介したコードを実行すると、以下の画像のようにoptionmenu Widget内の選択肢を選択するたびに、選択した選択肢の値を取得できます。
trace関数を利用する
trace関数を利用すると、
- optionmenu Widget内の選択肢を選択する
tk.OptionMenu('親要素', variable, 選択肢)
ortk.OptionMenu('親要素', variable, 選択肢1, 選択肢2, ...)
のvariable(現在選択されている選択肢の値)の値が変更される。- trace関数で設定する関数が呼ばれる。
- 選択した選択肢の値を取得
の流れで値を取得できます。
trace関数は、
1# 第一引数(必須) : 特定の文字
2# <特定の文字の種類>################
3# w : variable(現在選択されている選択肢の値)が変更または選択された場合に、第二引数の関数名を実行する
4# r : variable(現在選択されている選択肢の値)が読み込まれた場合に、第二引数の関数名を実行する
5# u : variable(現在選択されている選択肢の値)が削除された場合に、第二引数の関数名を実行する
6#################################
7# 第二引数(必須) : 実行する関数名
8.trace("特定の文字", "関数名")
で定義されます。
例えば以下のようなコードを作成すると、
1import tkinter as tk
2
3class Application(tk.Frame):
4 # 現在選択されているoptionmenu Widget内の選択肢の値を変数として扱う。
5 var = None
6
7 # optionmenu Widget内の選択肢が選択された場合に、実行する関数
8 def getSelectedValue(self, *args):
9 # 選択した選択肢の値を出力する。
10 print(self.var.get())
11
12 def __init__(self, master=None):
13 # Windowの初期設定を行う。
14 super().__init__(master)
15
16 # Windowの画面サイズを設定する。
17 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
18 self.master.geometry("300x200")
19
20 # Windowを親要素として、frame Widget(Frame)を作成する。
21 # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
22 frame = tk.Frame(self.master)
23 # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
24 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
25 frame.pack()
26
27 # 現在選択されているoptionmenu Widget内の選択肢の値を、文字列変数として扱う。
28 # StringVarについて : https://kuroro.blog/python/K53voPjJuKFfYrjmP8FP/
29 self.var = tk.StringVar()
30 # set() : 初期値としてaaaの選択肢を設定する。
31 self.var.set('aaa')
32
33 # frame Widget(Frame)を親要素として、optionmenu Widgetを作成する。
34 # self.var : 現在選択されている選択肢の値。文字列変数(self.var)として値を持たせることで、可変として扱う。
35 # 'aaa', 'bbb' : 選択肢1, 選択肢2
36 optionmenu = tk.OptionMenu(frame, self.var, 'aaa', 'bbb')
37
38 # 第一引数(必須) : 特定の文字
39 # w : variable(現在選択されている選択肢の値)が変更または選択された場合に、第二引数の関数名を実行する。
40 # 第二引数(必須) : 実行する関数名。self.getSelectedValueとする。
41 self.var.trace('w', self.getSelectedValue)
42
43 # frame Widget(Frame)を親要素とした場合に、optionmenu Widgetをどのように配置するのか?
44 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
45 optionmenu.pack()
46
47# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
48if __name__ == "__main__":
49 # Windowを生成する。
50 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
51 root = tk.Tk()
52 app = Application(master=root)
53
54 # Windowをループさせて、継続的にWindow表示させる。
55 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
56 app.mainloop()
以下の画像のようにoptionmenu Widget内の選択肢を選択するたびに、選択した選択肢の値を取得できます。
まとめ
- Tkinterで活用するoptionmenuとは、Widgetの一種でoptionmenuを選択すると、様々な選択肢を表示する入れ物を意味します。
- 別名optionmenu Widgetと呼ばれます。
- 選択した選択肢の値を取得するために、command option or trace関数を利用する。