Измените OptionMenu на основе того, что выбрано в другом OptionMenu

В настоящее время я пытаюсь сделать два OptionMenu s, где второй будет динамически обновляться на основе того, что выбрано в первом OptionMenu.

Например, я хотел бы сделать OptionMenu_A со списком

[North America, Europe, Asia]
  • Если выбрано Asia, тогда OptionMenu_B изменится на что-то вроде [Japan, China, Malasia].
  • Если выбрано Europe, то оно, например, изменится на [Germany, France, Switzerland].

Я могу сделать два OptionMenu, но не могу получить OptionMenu_B для обновления на основе состояния OptionMenu_A.

Кто-нибудь будет достаточно любезен, чтобы показать, возможно ли такое?

Ответ 1

Да, это возможно. С помощью StringVar.trace вы можете проверить, когда был изменен первый вариант. Затем удалите все опции второго OptionMenu и заполните его соответствующими параметрами. Если у вас есть структура данных, такая как словарь позади этого, может быть очень легко сопоставить соответствующие соответствия:

import sys
if sys.version_info[0] >= 3:
    import tkinter as tk
else:
    import Tkinter as tk


class App(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master)

        self.dict = {'Asia': ['Japan', 'China', 'Malaysia'],
                     'Europe': ['Germany', 'France', 'Switzerland']}

        self.variable_a = tk.StringVar(self)
        self.variable_b = tk.StringVar(self)

        self.variable_a.trace('w', self.update_options)

        self.optionmenu_a = tk.OptionMenu(self, self.variable_a, *self.dict.keys())
        self.optionmenu_b = tk.OptionMenu(self, self.variable_b, '')

        self.variable_a.set('Asia')

        self.optionmenu_a.pack()
        self.optionmenu_b.pack()
        self.pack()


    def update_options(self, *args):
        countries = self.dict[self.variable_a.get()]
        self.variable_b.set(countries[0])

        menu = self.optionmenu_b['menu']
        menu.delete(0, 'end')

        for country in countries:
            menu.add_command(label=country, command=lambda nation=country: self.variable_b.set(nation))


if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    app.mainloop()