根据在另一个OptionMenu中选择的内容更改OptionMenu

use*_*875 13 python tkinter dynamic optionmenu

我目前正在尝试制作两个OptionMenu,其中第二个将根据第一个中选择的内容动态更新OptionMenu.

例如,我想OptionMenu_A用list做

[North America, Europe, Asia]
Run Code Online (Sandbox Code Playgroud)
  • 如果Asia被选中,那么OptionMenu_B将改为类似的东西[Japan, China, Malasia].
  • 如果Europe选中,则它将更改[Germany, France, Switzerland]为例如.

我可以制作两个OptionMenu但不能OptionMenu_B根据OptionMenu_A状态更新.

如果这样的事情有可能,有人会表现得很友好吗?

A. *_*das 24

对的,这是可能的.随着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()
Run Code Online (Sandbox Code Playgroud)

  • "self.variable_a.set('Asia')"命令是否会自动触发updateoptions()以设置self.optionmenu_b? (2认同)