2013-06-22 8 views
11

現在、2つをOptionMenuで選択した内容に基づいて動的に更新する2つのOptionMenuを作成しようとしています。 Asiaが選択されている場合は別のOptionMenuで選択されているものに基づいてOptionMenuを変更します

例えば、私はリスト

[North America, Europe, Asia] 
  • OptionMenu_Aをしたいと思い、それからOptionMenu_B[Japan, China, Malasia]のようなものに変更されます。
  • Europeが選択されている場合は、たとえば[Germany, France, Switzerland]に変更されます。

私は2つのOptionMenu Sを作ることができていますが、OptionMenu_BOptionMenu_Aのステータスに基づいて更新することができません。

誰かがこのようなことが可能かどうかを示すのに十分親切でしょうか?

答えて

23

はい、可能です。 StringVar.traceを使用すると、最初のオプションがいつ変更されたかを確認できます。次に、2番目の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

関連する問題