如何从内部面板触发wx.EVT_CLOSE

时间:2019-05-31 20:18:58

标签: wxpython

我正在构建一个wxPython应用程序。 主框架包括一个主面板。 主面板包括其他面板。 在这些面板之一中,有一个“退出”按钮。 我希望当我按下“退出”按钮时关闭应用程序。 为此,我需要将wx.EVT_CLOSE触发到应用程序的主框架。我该如何触发该事件? 任何其他想法也是最欢迎的。 预先感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用wx.Window.Close()方法。此方法为您触发wx.CloseEvent。看看下面的代码,了解实现此方法的方法。

有关Close()方法的更多详细信息(和一些限制),请查看here,并使用一种自定义事件的方法,请检查这些answers

代码:

import wx

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="Exit button",size=(200,200))
        self.panel = wx.Panel(self)
        self.button = wx.Button(self.panel, label="Exit", pos=(50, 50))
        self.Bind(wx.EVT_BUTTON, self.OnExit)

    def OnExit(self,event):
        """
        According to the wxPython docs self should refer to a top level window.
        This is important in your case because according to your question you
        have a nested GUI. So make sure self is the frame containing everything 
        in your window
        """
        self.Close(force=True)

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()
else:
    pass

答案 1 :(得分:1)

为什么不使用self.Destroy
将面板放到其他面板中会使生活变得比原来复杂得多。相反,您可以将项目分组到多个面板中,然后使用sizer将面板排列在frame中。
回到当前的问题,这是我假设您尝试的示例,当您不发布任何代码时,这很棘手。

import wx
class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title)
        panel = wx.Panel(self, -1)
        sub_panel_1 = wx.Panel(panel, -1)
        sub_panel_2 = wx.Panel(panel, -1)

        main_Text = wx.StaticText(panel, -1, "Main Panel")
        sub_Text_1 = wx.StaticText(sub_panel_1, -1, "Sub Panel 1")
        other_button = wx.Button(sub_panel_1, -1 ,"Other")
        sub_Text_2 = wx.StaticText(sub_panel_2, -1, "Sub Panel 2")
        exit_button = wx.Button(sub_panel_2, -1 ,"Exit")

        self.Bind(wx.EVT_CLOSE, self.onExit)
        self.Bind(wx.EVT_BUTTON, self.onOther, other_button)
        self.Bind(wx.EVT_BUTTON, self.onExit, exit_button)

        panel.SetBackgroundColour("gold")
        sub_panel_1.SetBackgroundColour("lightgreen")
        sub_panel_2.SetBackgroundColour("lightblue")

        top_sizer = wx.BoxSizer(wx.VERTICAL)
        sub_sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sub_sizer_2 = wx.BoxSizer(wx.VERTICAL)
        bot_sizer = wx.BoxSizer(wx.HORIZONTAL)

        top_sizer.Add(main_Text, 0, wx.ALL, 10)
        sub_sizer_1.Add(sub_Text_1, 0, wx.ALL, 10)
        sub_sizer_1.Add(other_button, 0, wx.ALL, 10)
        sub_sizer_2.Add(sub_Text_2, 0, wx.ALL, 10)
        sub_sizer_2.Add(exit_button, 0, wx.ALL, 10)
        sub_panel_1.SetSizer(sub_sizer_1)
        sub_panel_2.SetSizer(sub_sizer_2)

        bot_sizer.Add(sub_panel_1, 1, wx.ALL|wx.EXPAND, 10)
        bot_sizer.Add(sub_panel_2, 1, wx.ALL|wx.EXPAND, 10)

        main_sizer = wx.BoxSizer(wx.VERTICAL)
        main_sizer.Add(top_sizer, 1, wx.ALL|wx.EXPAND, 10)
        main_sizer.Add(bot_sizer, 1, wx.ALL|wx.EXPAND, 10)

        panel.SetSizer(main_sizer)
        self.Show()

    def onExit(self, event):
        print("Exit")
        self.Destroy()

    def onOther(self, event):
        print("Don't Exit")

if __name__ == '__main__':
    app = wx.App()
    MyFrame(None,"Exit Button")
    app.MainLoop()

enter image description here

如您所见,它像往常一样使用self.Destroy,但要复杂得多。