wxPython 中的不同事件触发相同响应的解决方法

86 阅读2分钟

当在 wxPython 中单击“帮助->帮助...”或“文件->退出”时,都得到相同的 MessageBox 响应。

以下代码展示了该情况:

huake_00183_.jpg

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、解决方案

  1. 修改代码以区分两种事件的响应:
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 函数中,我们创建了一个信息对话框,显示帮助系统即将推出。

  1. 当你想在两个不同的事件中执行相同的事情时,可以使用 Bind() 方法将相同的事件处理程序绑定到两个事件。例如,以下代码将 OnExit 函数绑定到单击“文件->退出”和“帮助->关于”菜单项的事件:
self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_ABOUT)
  1. 使用 EVT_BUTTON 事件类型来检测按钮的点击事件,如下面代码所示:
self.Bind(wx.EVT_BUTTON, self.OnExit, self.btnExit)
  1. 对于更高级的事件绑定,你也可以使用 wx.EVT_SIZEwx.EVT_CHAR 等事件类型来检测窗口大小变化和按键事件。

  2. 使用 FindWindowById() 方法来查找特定窗口的 ID,如下面代码所示:

self.btnExit = wx.FindWindowById(wx.ID_EXIT)
  1. 你也可以使用 AddHandlerForWindowId() 方法来为特定窗口的事件添加事件处理程序,如下面代码所示:
self.AddHandlerForWindowId(wx.ID_EXIT, self.OnExit)
  1. 使用Connect()方法来连接事件处理程序到特定事件,如下面的代码所示:
self.Connect(wx.ID_EXIT, wx.EVT_BUTTON, self.OnExit)