【问题标题】:manage multiple windows in wxpython在 wxpython 中管理多个窗口
【发布时间】:2017-11-09 23:36:30
【问题描述】:

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

【问题讨论】:

    标签: wxpython


    【解决方案1】:

    我发现在 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()
    

    您可以阅读以下内容了解更多信息:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2018-01-16
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      相关资源
      最近更新 更多