当在 wxPython 中单击“帮助->帮助...”或“文件->退出”时,都得到相同的 MessageBox 响应。
以下代码展示了该情况:
class NewSheet(wx.Frame):
def __init__(self, parent, id, title, Nrows, Ncols, SheetName):
wx.Frame.__init__(self, parent, -1, title, size=(550, 500))
box = wx.BoxSizer(wx.VERTICAL)
menuBar = wx.MenuBar()
menu1 = wx.Menu()
menuBar.Append(menu1, '&File')
menu1.Append(1, "&Exit")
self.Bind(wx.EVT_MENU, self.OnExit, id=2)
menuBar.Append(menu8, '&Help')
menu8.Append(1, "&Help...")
self.Bind(wx.EVT_MENU, self.OnHelp, id=1)
self.SetMenuBar(menuBar)
self.SetSizer(box)
notebook = wx.Notebook(self, -1, style=wx.RIGHT)
sheet1 = MySheet(notebook, Nrows, Ncols)
notebook.AddPage(sheet1, str(SheetName))
sheet1.SetFocus()
box.Add(notebook, 1, wx.EXPAND)
self.Centre()
self.Show(True)
def OnExit(self, event):
self.Close(True) # NOT WORKING!
self.Exit() # NOT WORKING EITHER!
def OnHelp(self, event):
wx.MessageBox("HTML Based Help System coming soon", "Help System",
wx.OK | wx.ICON_INFORMATION, self)
2、解决方案
- 修改代码以区分两种事件的响应:
def OnExit(self, event):
choice = wx.MessageDialog(None, 'Are you sure you want to exit?', 'Confirm Exit',
wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
if choice.ShowModal() == wx.ID_YES:
self.Close()
def OnHelp(self, event):
wx.MessageBox("HTML Based Help System coming soon", "Help System",
wx.OK | wx.ICON_INFORMATION, self)
在 OnExit 函数中,我们使用 wx.MessageDialog 创建了一个确认对话框,询问用户是否确认退出程序。如果用户选择“是”,则关闭程序。在 OnHelp 函数中,我们创建了一个信息对话框,显示帮助系统即将推出。
- 当你想在两个不同的事件中执行相同的事情时,可以使用
Bind()方法将相同的事件处理程序绑定到两个事件。例如,以下代码将OnExit函数绑定到单击“文件->退出”和“帮助->关于”菜单项的事件:
self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_ABOUT)
- 使用
EVT_BUTTON事件类型来检测按钮的点击事件,如下面代码所示:
self.Bind(wx.EVT_BUTTON, self.OnExit, self.btnExit)
-
对于更高级的事件绑定,你也可以使用
wx.EVT_SIZE或wx.EVT_CHAR等事件类型来检测窗口大小变化和按键事件。 -
使用
FindWindowById()方法来查找特定窗口的 ID,如下面代码所示:
self.btnExit = wx.FindWindowById(wx.ID_EXIT)
- 你也可以使用
AddHandlerForWindowId()方法来为特定窗口的事件添加事件处理程序,如下面代码所示:
self.AddHandlerForWindowId(wx.ID_EXIT, self.OnExit)
- 使用Connect()方法来连接事件处理程序到特定事件,如下面的代码所示:
self.Connect(wx.ID_EXIT, wx.EVT_BUTTON, self.OnExit)