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

Tkinter でプルダウンメニューを作るにはいくつかの方法があります。
- Tkinter コンボボックス教程で紹介されたコンボボックス
Combobox
を使用する 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
は作成したオプションメニューの親レベルです。
variable
は tk.StrigVar
タイプの初期テキスト変数です。
*OptionList
はメニューの他のオプションです。*
はデータ容器用の unpack
です。ここでは list
を指します。
値を変更したときのコマンドを OptionMenu
にバインドする
OptionMenu
がオプションリストから新しい値を選択した場合、対応するコマンドを接続できません。ボタンウィジェットのようにコールバック関数を簡単にバインドすることはできません。
tk.Button(app, text="Increase", width=30, command=change_label_number)
あなたは trace
を使って observer
を Option 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()
trace
の observer
は 3つのモードがあります。
observer モード | 説明 |
---|---|
w |
variable が変更または選択された場合 |
r |
variable が読み込まれた場合 |
u |
variable が削除された場合 |
variable.trace("w", callback)
は、variable
がユーザによって変更または選択されたときに calback
関数を呼び出すことを意味します。
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