Как создать выпадающее меню в Tkinter

Jinku Hu 30 Январь 2023 18 Апрель 2020
  1. Tkinter OptionMenu Пример
  2. Привязать команду к OptionMenu When Value Changes
Как создать выпадающее меню в Tkinter

В Tkinter есть несколько способов создания выпадающего меню.

  1. Используйте Combobox, как описано в главе Tkinter tutorial Combobox.
  2. Используйте OptionMenu Widget.

OptionMenu немного похоже на виджет Combobox, но уже включён в сам Tkinter, поэтому нет необходимости импортировать ttk, как в случае с Combobox.

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.StringVar.

*OptionList - это другие опции меню. * используется для распаковки контейнера, так как здесь используется тип list.

Пример опцииМеню Tkinter

Привязать команду к OptionMenu When Value Changes

OptionMenu не смог связать команду при выборе нового значения из списка опций. Нельзя было просто связать с ней функцию обратного вызова, как виджет кнопки.

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

Вам нужно использовать метод трассировки, чтобы прикрепить обратные вызовы Обсервера к переменной OptionMenu. Каждый раз, когда переменная изменяется, она запускает функции обратного вызова.

Пример обратного вызова 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()

След наблюдателя имеет три режима,

режим наблюдателя Пояснение
w когда variable написана кем-то
r когда variable кем-то читается
u когда variable удалена

Тогда variable.trace("w", callback) означает, что она вызовет функцию callback, когда variable будет записана или выбрана пользователем.

Опция TkinterMenu 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