Tkinter でプルダウンメニューを作成する

Jinku Hu 2021年6月17日 2019年12月7日 Tkinter Tkinter Dropdown Menu
  1. Tkinter OptionMenu
  2. 値を変更したときのコマンドを OptionMenu にバインドする
Tkinter でプルダウンメニューを作成する

Tkinter でプルダウンメニューを作るにはいくつかの方法があります。

  1. Tkinter コンボボックス教程で紹介されたコンボボックス Combobox を使用する
  2. OptionMenu ウィジェットを使用します。

OptionMenu とコンボボックスのウィジェットは似ていますが、それは Tkinter 自身のモジュールですので、Combobox を呼び出すのと同じように ttk を呼び出す必要はありません。

Tkinter OptionMenu

import tkinter as tk

OptionList = [
"Aries",
"Taurus",
"Gemini",
"Cancer"
] 

app = tk.Tk()

app.geometry('100x200')

variable = tk.StringVar(app)
variable.set(OptionList[0])

opt = tk.OptionMenu(app, variable, *OptionList)
opt.config(width=90, font=('Helvetica', 12))
opt.pack()

app.mainloop()
opt = tk.OptionMenu(app, variable, *OptionList)

app は作成したオプションメニューの親レベルです。

variabletk.StrigVar タイプの初期テキスト変数です。

*OptionList はメニューの他のオプションです。* はデータ容器用の unpack です。ここでは list を指します。

Tkinter OptionMenu Example

値を変更したときのコマンドを OptionMenu にバインドする

OptionMenu がオプションリストから新しい値を選択した場合、対応するコマンドを接続できません。ボタンウィジェットのようにコールバック関数を簡単にバインドすることはできません。

tk.Button(app, text="Increase", width=30, command=change_label_number)

あなたは trace を使って observerOption Menu 変数にフィードバックする必要があります。変数が変更されるたびに、コールバック関数が起動されます。

OptionMenu コールバック関数の例

import tkinter as tk

OptionList = [
"Aries",
"Taurus",
"Gemini",
"Cancer"
] 

app = tk.Tk()

app.geometry('100x200')

variable = tk.StringVar(app)
variable.set(OptionList[0])

opt = tk.OptionMenu(app, variable, *OptionList)
opt.config(width=90, font=('Helvetica', 12))
opt.pack(side="top")

labelTest = tk.Label(text="", font=('Helvetica', 12), fg='red')
labelTest.pack(side="top")

def callback(*args):
    labelTest.configure(text="The selected item is {}".format(variable.get()))

variable.trace("w", callback)

app.mainloop()

traceobserver は 3つのモードがあります。

observer モード 説明
w variable が変更または選択された場合
r variable が読み込まれた場合
u variable が削除された場合

variable.trace("w", callback) は、variable がユーザによって変更または選択されたときに calback 関数を呼び出すことを意味します。

Tkinter OptionMenu Callback

Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn