我使用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函数可能是我需要做的,虽然我再也不确定如何...
答案 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()