wxPython中控件的邮件弹出式菜单是在 EVT_CONTEXT_MENU 事件中创建菜单对象,并且 EVT_CONTEXT_MENU 事件处理完毕后菜单对象即被释放。而主菜单栏MenuBar一般在窗口构造时即创建,为了让主菜单也可以根据条件动态生成菜单,可以借助 EVT_MENU_OPEN 事件来实现。
class MainFrame(wx.Frame):
def __init__(self):
super().__init__(None, wx.ID_ANY, '')
#创建一个 "文件" 菜单,其 "新建" 菜单的子菜单被动态生成
self.Bar = wx.MenuBar()
self.Menu = wx.Menu()
self.SubMenu = wx.Menu()
self.Menu.Append(wx.NewIdRef(), '新建', subMenu=self.SubMenu)
self.Bar.Append(self.Menu, '文件')
self.SetMenuBar(self.Bar);
#注册事件处理函数
self.Bind(wx.EVT_MENU_OPEN, self.onMenuOpen)
def onMenuOpen(self, evt):
#如果是 "文件" 菜单,则清除 "新建" 的子菜单,然后动态生成子菜单项增加进去
if evt.GetMenu() == self.Menu:
for _it in [x for x in self.SubMenu.MenuItems]:
self.SubMenu.DestroyItem(_it)
self.SubMenu.Append(wx.NewIdRef(), '菜单项1')
self.SubMenu.Append(wx.NewIdRef(), '菜单项2')
self.SubMenu.Append(wx.NewIdRef(), '菜单项3')
...