Как запустить wx.EVT_CLOSE с внутренней панели - PullRequest
0 голосов
/ 31 мая 2019

Я создаю приложение wxPython. Основная рама включает в себя главную панель. Основная панель включает в себя другие панели. На одной из этих панелей есть кнопка «Выход». Я хочу, чтобы приложение закрывалось при нажатии кнопки «Выход». Для этого мне нужно запустить wx.EVT_CLOSE в основной фрейм приложения. Как мне запустить это событие? Любые другие идеи также приветствуются. Заранее спасибо.

Я добавляю пример ниже, чтобы показать случай:

    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))

    class SubPanel(wx.Panel):
       def __init__(self, parent, size):
           wx.Panel.__init__(self, parent, size=size)
           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):       
           self.Destroy()

    def main():
       app = wx.App()
       mainFrame = MainScene(None, title='Melanoma Buster')
       mainFrame.Show()
       app.MainLoop()

    if __name__ == '__main__':
       main()

введите описание изображения здесь

И это после нажатия на кнопку «Выход»:

введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Почему бы не использовать Destroy?
Пример объекта, объясняющий важность примера кода при задании вопроса.

Вы все еще можете использовать Destroy, но просто укажите, что должно быть уничтожено.
Поскольку вы указали, что SubPanel имеет parent masterPanel, объект для уничтожения - self.GrandParent. Однако, если вы сделали parent из SubPanel self, то вы можете использовать self.Parent.Destroy().

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))

class SubPanel(wx.Panel):
    def __init__(self, parent, size):
        wx.Panel.__init__(self, parent, size=size)
        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):
        self.Close()
        self.GrandParent.Destroy()

def main():
    app = wx.App()
    mainFrame = MainScene(None, title='Melanoma Buster')
    mainFrame.Show()
    app.MainLoop()

if __name__ == '__main__':
   main()
1 голос
/ 01 июня 2019

Вы можете использовать метод 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...