2014-06-23 157 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() 
相关问题