使用for循环生成tKinter菜单

时间:2017-02-08 20:44:49

标签: python-2.7 for-loop tkinter

我使用tKinter,Python 2.7构建了一个简单的UI。我的代码如下所示:

from Tkinter import * 
import Tkinter, Tkconstants, tkFileDialog, tkMessageBox

class FileZap():
    def __init__(self, root):
        root.title("Test_App")
        root.geometry("900x550")        

        self.menu = Menu(root)
        self.fileMenu = Menu(self.menu)
        self.funcMenu = Menu(self.menu)
        self.advMenu = Menu(self.menu)
        self.toolMenu = Menu(self.menu)

        root.config(menu=self.menu, width=500, relief=RAISED, borderwidth=2)

        self.menu.add_cascade(label="File", menu=self.fileMenu)
        self.menu.add_cascade(label="Functions", menu=self.funcMenu)
        self.menu.add_cascade(label="Advanced", menu=self.advMenu)
        self.menu.add_cascade(label="Tools", menu=self.toolMenu)
        self.menu.add_command(label="Quit", command=root.quit)

        self.fileMenu.add_command(label="New")
        self.fileMenu.add_command(label="Open")
        self.fileMenu.add_command(label="Quit", command=root.quit)


        self.funcMenu.add_command(label="Properties")
        self.funcMenu.add_command(label="Properties")
        self.funcMenu.add_command(label="Properties")
        self.funcMenu.add('separator')
        self.funcMenu.add_command(label="Properties")
        self.funcMenu.add_command(label="Properties")       



root = Tkinter.Tk()
file_zap = FileZap(root)
root.mainloop()

我想知道我是否可以用更好的代码生成它 - 特别是使用for循环(或多个循环)。

我尝试声明一个列表并尝试迭代它的一部分,例如:

menuItems = ['File','Functions','Advanced','Tools','Quit']

for item in menuItems:
    self.menu.add_cascade(label=item, menu=self.fileMenu)

替换此块:

self.menu.add_cascade(label="File", menu=self.fileMenu)
self.menu.add_cascade(label="Functions", menu=self.funcMenu)
self.menu.add_cascade(label="Advanced", menu=self.advMenu)
self.menu.add_cascade(label="Tools", menu=self.toolMenu)
self.menu.add_command(label="Quit", command=root.quit)

但这没有成功,还有更多需要考虑的问题。如果有人能告诉我更好的方法,我将不胜感激,所以我可以将它应用到我的UI的其余部分。我已经读过使用lambda函数可能是我需要做的,虽然我再也不确定如何...

1 个答案:

答案 0 :(得分:2)

你可以使用OrderedDict,正如你所说的那样,在字典中循环运行并添加标签和菜单值作为值。

self.menuItems = OrderedDict([('File',self.fileMenu),('Functions',self.funcMenu),('Advanced',self.advMenu),('Tools', self.toolMenu),('Quit', root.quit)])

for k,v in self.menuItems.items():
    self.menu.add_cascade(label=k, menu=v)

尝试理解这三行是如何工作的并使用它们的逻辑。

    for k,v in self.menuItems.items():
        self.menu.add_cascade(label=k, menu=v)

from Tkinter import *
import Tkinter, Tkconstants, tkFileDialog, tkMessageBox
from collections import OrderedDict

class FileZap():
    def __init__(self, root):
        root.title("Test_App")
        root.geometry("900x550")
        self.menu = Menu(root)
        self.fileMenu = Menu(self.menu)
        self.funcMenu = Menu(self.menu)
        self.advMenu = Menu(self.menu)
        self.toolMenu = Menu(self.menu)

        root.config(menu=self.menu, width=500, relief=RAISED, borderwidth=2)

        self.menuItems = OrderedDict([('File',self.fileMenu),('Functions',self.funcMenu),('Advanced',self.advMenu),('Tools', self.toolMenu),('Quit', root.quit)])

        for k,v in self.menuItems.items():
            self.menu.add_cascade(label=k, menu=v)

        self.commands = ["New", "Open", "Quit"]

        for comm in self.commands:
            if comm != "Quit":
                self.fileMenu.add_command(label=comm)
            else:
                self.fileMenu.add_command(label=comm, command=root.quit)

        for index in range(6):
            if index != 3:
                self.funcMenu.add_command(label="Properties")
            else:
                self.funcMenu.add('separator')

root = Tkinter.Tk()
file_zap = FileZap(root)
root.mainloop()