2013-06-22 19 views
11

Tôi hiện đang cố gắng thực hiện hai số OptionMenu s, trong đó tùy chọn thứ hai sẽ được cập nhật động dựa trên những gì được chọn trong OptionMenu đầu tiên.Thay đổi OptionMenu dựa trên những gì được chọn trong OptionMenu

Ví dụ, tôi muốn thực hiện OptionMenu_A với danh sách

[North America, Europe, Asia] 
  • Nếu Asia được chọn, sau đó OptionMenu_B sẽ thay đổi một cái gì đó giống như [Japan, China, Malasia].
  • Nếu Europe được chọn, sau đó nó sẽ thay đổi thành [Germany, France, Switzerland] chẳng hạn.

tôi có thể làm cho hai OptionMenu s nhưng không thể có được OptionMenu_B để cập nhật dựa trên tình trạng OptionMenu_A 's.

Có ai đủ tử tế để thể hiện nếu điều đó là có thể không?

Trả lời

23

Có, điều đó là có thể. Với StringVar.trace bạn có thể kiểm tra thời điểm tùy chọn đầu tiên đã được thay đổi. Sau đó xóa tất cả các tùy chọn của OptionMenu thứ hai và điền nó với các tùy chọn tương ứng. Nếu bạn có một cấu trúc dữ liệu như một cuốn từ điển sau này, nó có thể rất dễ dàng để lập bản đồ thư từ:

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

Liệu các "self.variable_a.set ('Châu Á')" lệnh tự động kích hoạt updateoptions() để tự .optionmenu_b được đặt? – Tango

Các vấn đề liên quan