2013-06-22 46 views
11

我目前正在尝试制作两个OptionMenu,其中第二个将根据第一个OptionMenu中选择的内容动态更新。基于在另一个OptionMenu中选择什么更改OptionMenu

例如,我想

[North America, Europe, Asia] 
  • 如果Asia被选中,然后OptionMenu_B会更改为类似[Japan, China, Malasia]使OptionMenu_A与名单。
  • 如果选择了Europe,则它将变为例如[Germany, France, Switzerland]

我能够做两个OptionMenu秒,但OptionMenu_B更新基于OptionMenu_A的地位不能得到。

有人会表示这样的事情是否可能?

回答

23

是的,这是可能的。用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() 
+2

请问“self.variable_a.set(‘亚洲’)”命令自动触发updateoptions()这样的自.optionmenu_b已设置? – Tango