我正在构建一个wxPython应用程序。 主框架包括一个主面板。 主面板包括其他面板。 在这些面板之一中,有一个“退出”按钮。 我希望当我按下“退出”按钮时关闭应用程序。 为此,我需要将wx.EVT_CLOSE触发到应用程序的主框架。我该如何触发该事件? 任何其他想法也是最欢迎的。 预先感谢。
答案 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()
如您所见,它像往常一样使用self.Destroy
,但要复杂得多。