2014-06-23 80 views
1

我想要一個OptionMenu類列表選擇器,但我想有嵌套選項。我希望它們像嵌套菜單一樣(文件 - >保存),但我需要將其網格化。如果這是不可能的(寫作自定義小部件不足),我將最終有兩個選擇器,其中第一個選擇「主菜單」,第二個選擇「子菜單」,但我會真的很想避免這樣做。是否有像OptionMenu可以嵌套的任何Tkinter小部件?

+0

也許[pwm](http://pmw.sourceforge.net/)有一些對你有用的東西。 – Marcin

回答

4

上午optionmenu只是一個便利的功能,創建menubutton和菜單。你可以很容易地做到這一點。以下是一個示例:

import Tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 

     items = {"one": ["a","b","c"], 
       "two": ["d","e","f"], 
       "three": ["g","h","i"]} 

     self.the_value = tk.StringVar() 
     self.the_value.set("a") 

     self.menubutton = tk.Menubutton(self, textvariable=self.the_value, indicatoron=True) 
     self.topMenu = tk.Menu(self.menubutton, tearoff=False) 
     self.menubutton.configure(menu=self.topMenu) 

     for key in sorted(items.keys()): 
      menu = tk.Menu(self.topMenu) 
      self.topMenu.add_cascade(label=key, menu=menu) 
      for value in items[key]: 
       menu.add_radiobutton(label=value, variable = self.the_value, value=value) 

     self.menubutton.pack() 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(fill="both", expand=True) 
    root.mainloop() 
+0

啊,所以你可以在任何地方放置菜單,例如'Menubutton'。謝謝! – Adam

1

對上述代碼的改進以支持更長的菜單。享受遞歸。

import Tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, parent): 

     def create_menu(top_info, top_menu, value_var): 
      if isinstance(top_info, dict): 
       print "Evaluating dictionary with keys:" 
       for key in top_info.keys(): 
        print 'Key:' + key 
        menu = tk.Menu(top_menu) 
        top_menu.add_cascade(label=key, menu=menu) 
        create_menu(top_info[key], menu, value_var) 
       return 
      else: 
       print "Evaluating list of values:" 
       for value in top_info: 
        print 'Value:' + value 
        top_menu.add_radiobutton(label=value, variable = value_var, value=value) 
       return 

     tk.Frame.__init__(self, parent) 

     items = {"one": {"a":["aa","aaa","aaaa"],"b":["bb","bb"],"c":["cc"] }, 
       "two": ["d","e","f"], 
       "three": ["g","h","i"]} 

     self.the_value = tk.StringVar() 
     self.the_value.set("a") 

     self.menubutton = tk.Menubutton(self, textvariable=self.the_value, indicatoron=True) 
     self.topMenu = tk.Menu(self.menubutton, tearoff=False) 
     self.menubutton.configure(menu=self.topMenu) 

     create_menu(items, self.topMenu, self.the_value) 

     self.menubutton.pack() 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(fill="both", expand=True) 
    root.mainloop() 
相關問題