我遇到了创建适合我的应用程序需求的菜单的问题。我正在创建一个应用程序,要求用户在源菜单中选择可能的项目进行比较。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()
假设你知道如何制作菜单,创建子菜单没有什么特别难的。告诉我们你试过了什么,也许我们可以指出你做错了什么。 –
好的。我添加了一个非工作代码的例子。我真的只需要一个如何做到这一点的例子,并找不到一个。 –