在Python中用wxFormBuilder 3.10.1实现上下文菜单遇问题求助
wxFormBuilder生成上下文菜单事件绑定的解决方案
- wxFormBuilder 3.10.1里Frame属性的"context_menu"复选框存在版本适配问题,勾选后不会生成
EVT_CONTEXT_MENU的绑定代码,无需纠结该选项的存在。 - 标准且安全的做法是在自定义子类中添加绑定,而非修改wxFormBuilder生成的源码(生成代码会被重新覆盖),具体实现步骤:
- 保留wxFormBuilder自动生成的基类代码不做修改;
- 创建继承自该基类的子类,在子类的
__init__方法中添加上下文菜单的事件绑定; - 实现菜单弹出及菜单项的功能逻辑。
示例代码:
# wxFormBuilder自动生成的基类(请勿修改) class MyFrameBase(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, size=wx.Size(500,300), style=wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) self.SetSizeHints(wx.DefaultSize, wx.DefaultSize) # Connect Events self.Bind(wx.EVT_CLOSE, self.OnClose) def __del__(self): pass def OnClose(self, event): event.Skip() # 自定义子类,在这里实现上下文菜单逻辑 class MyFrame(MyFrameBase): def __init__(self, parent): MyFrameBase.__init__(self, parent) # 添加上下文菜单事件绑定 self.Bind(wx.EVT_CONTEXT_MENU, self.show_context_menu) def show_context_menu(self, event): # 创建菜单并添加选项 context_menu = wx.Menu() open_item = context_menu.Append(wx.ID_ANY, "打开文件") save_item = context_menu.Append(wx.ID_ANY, "保存配置") # 绑定菜单项的点击事件 self.Bind(wx.EVT_MENU, self.on_open_file, open_item) self.Bind(wx.EVT_MENU, self.on_save_config, save_item) # 弹出菜单 self.PopupMenu(context_menu, event.GetPosition()) context_menu.Destroy() def on_open_file(self, event): wx.MessageBox("触发打开文件操作", "提示") def on_save_config(self, event): wx.MessageBox("触发保存配置操作", "提示")
- 这种方式并非"变通方案",而是wxPython开发中分离自动生成代码与业务逻辑的标准实践,能有效避免wxFormBuilder重新生成代码时丢失自定义修改。
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

