我正在尝试找到一种方法来压缩和自动构建主菜单(在标题栏下方,使用文件,编辑,帮助< wxPython中的/ em>等)。
写出每个菜单项都是直接的,但我注意到我在自然,重排ID等之间重复了很多。其次是其他独特的坑,如果我想在特定菜单中添加图标,或者如果我有子菜单,他们可能有子菜单等。没有一种一致的方式来列出所有内容,只需将信息添加到列表或字典,或两者的组合,我的wx.Frame对象将变得非常密集。
我看不到干净有序的做法,缺少三维数组。即使在那时,我也不知道如何统一组织3D阵列,所以每件物品都准备好了。
这是我到目前为止(原谅任何缩进错误;它对我有效):
T
我尝试使用list-to-dictionary的东西来实现它,所以在引用ID时我不需要特定的索引号,只需写入关键字并获取ID。我写了一次,并将其应用到函数的其余部分。
注意我必须创建一个全新的变量并重复自己,比如MM_File,MM_Edit,MM_Help,每次我都会输入类似的信息来追加和绑定。请记住,有些菜单可能需要分隔符,或菜单中有菜单,或者我可能想在这些菜单项旁边使用精灵,所以我试图想办法如何组织我的数组到那样做。
将这个组织成一个简洁的系统的适当方法是什么,所以它不会膨胀这个类?
答案 0 :(得分:0)
您可以采用以下几种方法。如果您愿意,可以将菜单生成代码放入辅助函数中。这样的事情应该有效:
def menu_helper(self, menu, menu_id, name, help, handler, sep=True):
menu_obj = wx.Menu()
if sep:
menu_obj.AppendSeparator()
menu_item = menu_obj.Append(menu_id, name, help)
self.Bind(wx.EVT_MENU, handler, menu_item)
self.MainMenu.Append(menu_obj, menu)
这是一个完整的例子:
import wx
class frameMain(wx.Frame):
"""The main application frame."""
def __init__(self,
parent=None,
id=-1,
title='TITLE',
pos=wx.DefaultPosition,
size=wx.Size(550, 400),
style=wx.DEFAULT_FRAME_STYLE):
"""Initialize the Main frame structure."""
wx.Frame.__init__(self, parent, id, title, pos, size, style)
self.Center()
self.CreateStatusBar()
self.buildMainMenu()
def buildMainMenu(self):
"""Creates the main menu at the top of the screen."""
self.MainMenu = wx.MenuBar()
# Establish menu item IDs.
menuID_File = 'exit'
menuID_Help = 'about'
menuID_ALL = [menuID_File,
menuID_Help]
# Make a dictionary of the menu item IDs.
self.menuID = {item: wx.NewId() for item in menuID_ALL}
# Create the menus.
self.menu_helper('File', self.menuID['exit'], 'Exit',
'Exit application', self.onExit)
self.menu_helper('Help', self.menuID['about'], 'About',
'About the application.', self.onAbout)
# Install the Main Menu.
self.SetMenuBar(self.MainMenu)
def menu_helper(self, menu, menu_id, name, help, handler, sep=True):
"""
"""
menu_obj = wx.Menu()
if sep:
menu_obj.AppendSeparator()
menu_item = menu_obj.Append(menu_id, name, help)
self.Bind(wx.EVT_MENU, handler, menu_item)
self.MainMenu.Append(menu_obj, menu)
#----------------------------------------------------------------------
def onExit(self, event):
pass
def onAbout(self, event):
pass
if __name__ == '__main__':
app = wx.App(False)
frame = frameMain()
frame.Show()
app.MainLoop()
或者您可以创建一个处理所有菜单创建的类。您还可以创建一个配置文件,其中包含您创建菜单时所读取的所有信息。另一种选择是使用XRC,虽然我个人觉得有点限制。