Вы можете использовать метод wx.Window.Close()
. Этот метод вызывает wx.CloseEvent
для вас. Взгляните на код ниже, чтобы узнать, как это реализовать.
Для получения более подробной информации (и некоторых ограничений) о методе Close () посмотрите здесь и чтобы узнать, как использовать ваше пользовательское событие, проверьте эти ответы .
Код:
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
РЕДАКТИРОВАТЬ НА ОСНОВЕ ОБНОВЛЕНИЯ ВОПРОСА
Вы можете разместить вызов Destroy()
либо в классе MainScene
, либо в классе SubPanel
. Когда использовать один или другой, зависит от того, является ли кнопка «Выход» чем-то конкретным для класса MainScene
(тогда я бы поставил вызов Destroy()
в классе MainScene) или это то, что класс SubPanel
должен всегда делать ( тогда я бы поместил вызов Destroy()
в класс SubPanel
).
Destroy()
Позвоните в MainScene
Класс:
import wx
class MainScene(wx.Frame):
def __init__(self, parent, title):
super(MainScene, self).__init__(parent, title=title, size=(300, 300))
self.InitUI()
def InitUI(self):
# Define Master Panel
masterPanel = wx.Panel(self)
masterPanel.SetBackgroundColour("gold")
horzbox = wx.BoxSizer(wx.HORIZONTAL)
subPanel=SubPanel(parent=masterPanel, size=(200, 200))
subPanel.exit_button.Bind(wx.EVT_BUTTON, self.Close)
def Close(self, event):
print('Called from MainScene')
self.Destroy()
class SubPanel(wx.Panel):
def __init__(self, parent, size):
wx.Panel.__init__(self, parent, size=size)
self.SetBackgroundColour("gray")
vbox = wx.BoxSizer(wx.VERTICAL)
self.exit_button = wx.Button(self, label="Exit")
vbox.Add(self.exit_button, proportion=1, flag=wx.ALL | wx.CENTER, border=5)
self.SetSizer(vbox)
def main():
app = wx.App()
mainFrame = MainScene(None, title='Melanoma Buster')
mainFrame.Show()
app.MainLoop()
if __name__ == '__main__':
main()
Destroy()
звонок из SubPanel
класс:
import wx
class MainScene(wx.Frame):
def __init__(self, parent, title):
super(MainScene, self).__init__(parent, title=title, size=(300, 300))
self.InitUI()
def InitUI(self):
# Define Master Panel
masterPanel = wx.Panel(self)
masterPanel.SetBackgroundColour("gold")
horzbox = wx.BoxSizer(wx.HORIZONTAL)
subPanel=SubPanel(parent=masterPanel, size=(200, 200), mainWin=self)
class SubPanel(wx.Panel):
def __init__(self, parent, size, mainWin):
wx.Panel.__init__(self, parent, size=size)
self.mainWin = mainWin
self.SetBackgroundColour("gray")
vbox = wx.BoxSizer(wx.VERTICAL)
exit_button = wx.Button(self, label="Exit")
exit_button.Bind(wx.EVT_BUTTON, self.onClose)
vbox.Add(exit_button, proportion=1, flag=wx.ALL | wx.CENTER, border=5)
self.SetSizer(vbox)
def onClose(self, event):
print('Called from SubPanel')
self.mainWin.Destroy()
def main():
app = wx.App()
mainFrame = MainScene(None, title='Melanoma Buster')
mainFrame.Show()
app.MainLoop()
if __name__ == '__main__':
main()