2013-06-22 11 views
11

Obecnie próbuję utworzyć dwa OptionMenu s, gdzie drugi będzie aktualizowany dynamicznie w oparciu o to, co jest wybrane w pierwszym OptionMenu.Zmień OptionMenu na podstawie tego, co jest wybrane w innym Option Menu

Na przykład, chciałbym, aby OptionMenu_A z listy

[North America, Europe, Asia] 
  • Jeśli Asia jest zaznaczona, a następnie OptionMenu_B zmieni się coś podobnego [Japan, China, Malasia].
  • Po wybraniu Europe zmieni się na [Germany, France, Switzerland].

jestem w stanie zrobić dwa OptionMenu s, ale nie może dostać OptionMenu_B aby aktualizować w oparciu o status OptionMenu_A „s.

Czy ktoś byłby na tyle uprzejmy, aby pokazać, czy coś takiego jest możliwe?

Odpowiedz

23

Tak, jest to możliwe. Dzięki StringVar.trace możesz sprawdzić, kiedy pierwsza opcja została zmieniona. Następnie usuń wszystkie opcje drugiego menu Option i zapełnij je odpowiednimi opcjami. Jeśli masz strukturę danych jak słownik za to, to może być bardzo łatwo odwzorowywać korespondencji:

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

spowoduje „self.variable_a.set («Asia»)” komenda automatycznie wyzwalać updateoptions(), tak ja .optionmenu_b jest ustawione? – Tango

Powiązane problemy