在wxpython中管理多个窗口

在wxpython中管理多个窗口,wxpython,Wxpython,我的wxpython项目需要许多窗口,这些窗口可以通过用户小部件相互调用。 我看到了如何在一个框架中创建多个面板,但这会导致一个巨大的文件,因为一些面板需要复杂的处理程序。 我看到了如何同时启动几个窗口,但没有看到如何编写代码在它们之间移动。 我是PythonNoob,但拥有二十年的微控制器和C。 请指点( 双关语(有意的)。格雷厄姆。我发现在wxPython中,类或帧之间通信的最佳方式是使用pubsub。这使您可以轻松地在窗口之间发送数据,并在其他窗口中调用方法 下面是一个简单的例子: imp

我的wxpython项目需要许多窗口,这些窗口可以通过用户小部件相互调用。 我看到了如何在一个框架中创建多个面板,但这会导致一个巨大的文件,因为一些面板需要复杂的处理程序。 我看到了如何同时启动几个窗口,但没有看到如何编写代码在它们之间移动。 我是PythonNoob,但拥有二十年的微控制器和C。 请指点(
双关语(有意的)。格雷厄姆。

我发现在wxPython中,类或帧之间通信的最佳方式是使用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()
您可以通过以下网站了解更多信息: