2013-06-22 11 views
11

मैं वर्तमान में दो OptionMenu एस बनाने की कोशिश कर रहा हूं, जहां दूसरा OptionMenu में चयनित चीज़ों के आधार पर गतिशील रूप से अपडेट किया जाएगा।विकल्प बदलें मेन्यू किसी अन्य विकल्प में चुने गए विकल्प के आधार पर मेनू

उदाहरण के लिए, मैं Asia चयन किया जाता है

[North America, Europe, Asia] 
  • , तो OptionMenu_B[Japan, China, Malasia] की तरह कुछ के लिए बदल जाएगा की सूची के साथ OptionMenu_A बनाने के लिए करना चाहते हैं।
  • यदि Europe चुना गया है, तो यह उदाहरण के लिए [Germany, France, Switzerland] पर बदल जाएगा।

मैं दो OptionMenu रों बनाने के लिए सक्षम हूँ, लेकिन OptionMenu_BOptionMenu_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

संबंधित मुद्दे