2017-11-09 1 views
0

Mein Wxpython-Projekt benötigt eine Reihe von Fenstern, die sich gegenseitig mit Benutzer-Widgets aufrufen können. Ich sehe, wie man mehrere Panels in einem Frame erstellt, aber das führt zu einer riesigen Datei, da einige Panels komplexe Handler benötigen. Ich sehe, wie man mehrere Fenster gleichzeitig startet, aber nicht, wie man Code schreibt, um zwischen ihnen zu bewegen. Ich bin ein Python Noob, aber habe zwei Jahrzehnte von Mikrocontrollern und C. Zeiger würden geschätzt werden ( Wortspiel absichtlich). Graham.Verwalten mehrerer Fenster in Wxpython

Antwort

0

Ich finde den besten Weg zur Kommunikation zwischen Klassen oder Frames in WxPython ist Pubsub verwenden. Dies ermöglicht Ihnen, Daten zwischen Fenstern leicht zu senden und Methoden in anderen Fenstern aufzurufen.

Hier ist ein einfaches Beispiel:

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

Sie können mehr über ihn unter der folgenden lesen:

Verwandte Themen