Change OptionMenu based on what is selected in another OptionMenu

≯℡__Kan透↙ 提交于 2019-11-26 12:46:54

问题


I am currently trying to make two OptionMenus, where the second will be updated dynamically based on what is selected in the first OptionMenu.

For example, I would like to make OptionMenu_A with list

[North America, Europe, Asia]
  • If Asia is selected, then OptionMenu_B will change to something like [Japan, China, Malasia].
  • If Europe is selected, then it will change to [Germany, France, Switzerland] for example.

I am able to make two OptionMenus but can\'t get OptionMenu_B to update based on OptionMenu_A\'s status.

Would anybody be kind enough to show if such thing is possible?


回答1:


Yes, it is possible. With StringVar.trace you can check when the first option has been changed. Then delete all the options of the second OptionMenu and populate it with the corresponding options. If you have a data structure like a dictionary behind this, it can be very easy to map the correspondences:

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()


来源:https://stackoverflow.com/questions/17252096/change-optionmenu-based-on-what-is-selected-in-another-optionmenu

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!