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

胡金庫 2023年1月30日
  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

著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook