使用for循环生成tKinter菜单

BidonPython

我使用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函数可能是我需要做的,尽管我不确定如何...

omri_saadon

您可以使用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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章