2014-02-16 98 views
0

我遇到了创建适合我的应用程序需求的菜单的问题。我正在创建一个应用程序,要求用户在源菜单中选择可能的项目进行比较。Python Tkinter子菜单单选按钮

现在我的菜单组织indended看起来像

FILE | EDIT | OPTIONS | SOURCE | HELP 

我的问题是,内源选择的数量是相当大的(〜100),需要进行navicable快速(< 5秒)或者我的应用程序的目标受众可能不会使用它。

我想到的解决方案是在它们来自的数据结构下嵌套选项。实际上,这意味着我可以把源选项和子选项为两个列表:

["Data1", "Data2", "Data3"] 

[["Option1_1", "Option1_2", "Option1_3"], 
["Option2_1","Option2_2","Option2_3"], 
["Option3_1","Option3_2","Option3_3"]] 

我已经广泛搜索,无法找到如何在Tkinter的有效创建子菜单。当我得到一个单选按钮子菜单(checkbuttons也可以)时,按钮单击不会激活该命令,这不是一个可行的解决方案。

我想什么做的是创建一个看起来像

FILE | SOURCE | ETC... 
      Data1 | 
       Option1_1 
       Option1_2 
       Option1_3 
     Data2 | 
     Data3 

我怎样才能做到这一点的菜单?最好在将按钮存储到列表中,然后将它们附加到菜单中,以便我可以在需要时调用select和deselect? Radibuttons或checkbuttons将工作,checkbuttons是首选,如果我仍然可以在创建后访问它们。

谢谢

这里的非工作代码一个例子:

from Tkinter import * 
class App(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.makeMenu(master) 

    def makeMenu(self, parent): 
     menuBar = Frame(parent, relief = 'raised', borderwidth = 1) 
     fileMenu = Menubutton(menuBar, text = "File") 
     fileMenu.pack(side = 'left') 
     fileMenu.menu = Menu(fileMenu, tearoff = 0) 
     load = Menubutton(fileMenu.menu, text="Load") 
     load.pack(anchor=W) 
     source = Menubutton(fileMenu.menu, text="Source") 
     source.pack(anchor=W) 
     source.menu = Menu(source, tearoff = 0) 
     self._listi = ["who", "what", "where", "how"] 
     self._buttonList = [] 
     for l in self._listi: 
      c = Checkbutton(master = source.menu, text=l, command=lambda arg0=l: self.test(arg0)) 
      self._buttonList.append([l, c]) 
      c.pack() 
     save = Button(master=fileMenu.menu, text="Save") 
     save.pack(anchor=W) 
     exit = Button(master=fileMenu.menu, text="Exit", command = self.quit) 
     exit.pack() 
     fileMenu['menu'] = fileMenu.menu 
     menuBar.pack() 

    def test(self, arg0): 
     for b in self._buttonList: 
      if arg0 != b[0]: 
       b[1].deselect() 
      elif arg0 == b[0]: 
       b[1].select() 


# create app 
myApp = App() 

# start program 
myApp.mainloop() 
+1

假设你知道如何制作菜单,创建子菜单没有什么特别难的。告诉我们你试过了什么,也许我们可以指出你做错了什么。 –

+0

好的。我添加了一个非工作代码的例子。我真的只需要一个如何做到这一点的例子,并找不到一个。 –

回答

1

不能添加CheckbuttonButton实例的菜单。您必须使用add_checkbuttonadd_radiobuttonadd_command方法。此外,您不需要从框架和menubuttons创建菜单栏 - 您可以将菜单直接附加到窗口。此外,您不需要以编程方式选择或取消选择由tkinter负责的检查按钮或单选按钮。

我修改您的代码来说明:

from Tkinter import * 
class App(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.makeMenu(master) 

    def makeMenu(self, parent): 
     menuBar = Menu(parent) 
     parent.configure(menu=menuBar) 
     fileMenu = Menu(menuBar) 
     sourceMenu = Menu(menuBar) 
     menuBar.add_cascade(label="File", menu=fileMenu) 
     fileMenu.add_command(label="Load") 
     fileMenu.add_cascade(label="Source", menu=sourceMenu) 
     self._listi = ["who","what","where","how"] 
     for l in self._listi: 
      sourceMenu.add_checkbutton(label=l, command=lambda arg0=l: self.test(arg0)) 
     fileMenu.add_command(label="Save") 
     fileMenu.add_command(label="Exit", command=self.quit) 


    def test(self, arg0): 
     print "you clicked on", arg0 


# create app 
root = Tk() 
myApp = App(root) 

# start program 
myApp.mainloop() 

请注意,我还添加了一行代码来创建根窗口,而我传递根窗口进入的构造函数的应用程序。