KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
Tkinterで使われるoptionmenuとは?活用事例を交えて徹底解説!?

Tkinterで使われるoptionmenuとは?活用事例を交えて徹底解説!?

今回はTkinterで利用されるoptionmenuに関して、活用事例を交えて解説いたします。optionmenuの使い方がわからない、活用事例を通してoptionmenuを学びたい方へおすすめです。ぜひ最後までご覧ください。

目次
  1. そもそもTkinterで使われるoptionmenuとは?
  2. Tkinterの構成要素
  3. 下準備
  4. Tkinterで活用されるopitonmenu Widgetの定義
    1. activeforeground
    2. background, bg
    3. height, width
    4. anchor
    5. bd, borderwidth
    6. bitmap
    7. cursor
    8. direction
    9. fg, foreground
    10. font
    11. image
    12. compound
    13. wraplength
    14. justify
    15. menu
    16. padx, pady
    17. relief
    18. state
    19. disabledforeground
  5. 選択した選択肢の値を取得する方法【2種類】
    1. command optionを利用する
    2. trace関数を利用する
  6. まとめ
  7. 参考文献
目次を開く⬇︎

そもそも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を利用すると、

  1. optionmenu Widget内の選択肢を選択する
  2. command optionで設定する関数が呼ばれる
  3. 選択した選択肢の値を取得

の流れで値を取得できます。

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関数を利用すると、

  1. optionmenu Widget内の選択肢を選択する
  2. tk.OptionMenu('親要素', variable, 選択肢) or tk.OptionMenu('親要素', variable, 選択肢1, 選択肢2, ...)variable(現在選択されている選択肢の値)の値が変更される。
  3. trace関数で設定する関数が呼ばれる。
  4. 選択した選択肢の値を取得

の流れで値を取得できます。

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関数を利用する。

参考文献