2013-06-22 14 views
11

'da neyin seçili olduğuna bağlı olarak OptionMenu'yu değiştirin. Ikincisi, ilk OptionMenu'da seçili olana göre dinamik olarak güncellenecek iki OptionMenu s yapmaya çalışıyorum.Başka bir OptionMenu

Örneğin, ben Asia ardından OptionMenu_B[Japan, China, Malasia] gibi bir şey değişecektir seçilir

[North America, Europe, Asia] 
  • Eğer liste ile OptionMenu_A yapmak istiyorum.
  • Europe seçiliyse, örneğin [Germany, France, Switzerland] olarak değişir.

İki OptionMenu s yapmak mümkün ama OptionMenu_BOptionMenu_A 'ın durumuna bağlı olarak güncellenir olamıyorum.

Böyle bir şeyin mümkün olup olmadığını göstermek için kimse yeterli olur mu?

cevap

23

Evet, bu mümkün. StringVar.trace ile ilk seçeneğin ne zaman değiştirildiğini kontrol edebilirsiniz. Ardından, ikinci OptionMenu'nun tüm seçeneklerini silin ve ilgili seçeneklerle doldurun.

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 ('Asya')" komutu otomatik updateoptions tetikleyebilir() böylece kendini mu: Bunun arkasında bir sözlük gibi bir veri yapısını varsa, yazışmaları haritaya çok kolay olabilir .optionmenu_b ayarlandı mı? – Tango