如果窗口关闭,如何通知应用程序

时间:2014-12-07 15:28:14

标签: wxpython

我有一个wxpython应用程序。在此应用程序中,您可以启动独立存在的窗口(框架),因此在主应用程序的框架之外。主应用程序知道这个窗口,窗口本身(尚未)知道它的父窗口。

如果关闭窗口,主应用程序应该知道这一点,因为它需要停止发送某些更新。原则上很容易做到,我只是将父母传递给窗口,当它关闭时,我抓住一个事件,让父母知道窗口在窗口关闭之前已经关闭。

是否有其他方法可以从主应用程序中检测到此窗口已关闭?我正在操作(可疑?)假设我应该尝试让窗口不知道父母,但同样,这可能是无稽之谈。

那么让父母知道这个窗口已被关闭的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我建议使用pubsub。它可以发送您已在主窗口(或其他窗口)中订阅的消息并采取相应措施。我不久前写了一篇关于这个主题的教程,你可能会觉得有帮助:

以下是该教程中的一些示例代码,几乎完全与您所说的相同

import wx
from wx.lib.pubsub import pub 

########################################################################
class OtherFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, wx.ID_ANY, "Secondary Frame")
        panel = wx.Panel(self)

        msg = "Enter a Message to send to the main frame"
        instructions = wx.StaticText(panel, label=msg)
        self.msgTxt = wx.TextCtrl(panel, value="")
        closeBtn = wx.Button(panel, label="Send and Close")
        closeBtn.Bind(wx.EVT_BUTTON, self.onSendAndClose)

        sizer = wx.BoxSizer(wx.VERTICAL)
        flags = wx.ALL|wx.CENTER
        sizer.Add(instructions, 0, flags, 5)
        sizer.Add(self.msgTxt, 0, flags, 5)
        sizer.Add(closeBtn, 0, flags, 5)
        panel.SetSizer(sizer)

    #----------------------------------------------------------------------
    def onSendAndClose(self, event):
        """
        Send a message and close frame
        """
        msg = self.msgTxt.GetValue()
        pub.sendMessage("panelListener", message=msg)
        pub.sendMessage("panelListener", message="test2", arg2="2nd argument!")
        self.Close()

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        pub.subscribe(self.myListener, "panelListener")

        btn = wx.Button(self, label="Open Frame")
        btn.Bind(wx.EVT_BUTTON, self.onOpenFrame)

    #----------------------------------------------------------------------
    def myListener(self, message, arg2=None):
        """
        Listener function
        """
        print "Received the following message: " + message
        if arg2:
            print "Received another arguments: " + str(arg2)

    #----------------------------------------------------------------------
    def onOpenFrame(self, event):
        """
        Opens secondary frame
        """
        frame = OtherFrame()
        frame.Show()

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="New PubSub API Tutorial")
        panel = MyPanel(self)
        self.Show()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

您可能还想查看文档:

如果您下载单独的库,也可以在wxPython之外使用Pubsub。官方网站有一些很好的例子,你可以在你的wxPython应用程序中使用一点点改编: