2017-11-09 168 views
0

私のwxpythonプロジェクトでは、ユーザウィジェットで互いに呼び出すことができるいくつかのウィンドウが必要です。 1つのフレームに複数のパネルを作成する方法を見ていますが、複雑なハンドラを必要とするパネルがあるため、1つの大きなファイルにつながります。 私はいくつかのウィンドウを同時に起動する方法を見ていますが、それらの間を移動するコードを書く方法はありません。 私はPythonのnoobですが、20年のマイクロコントローラとCを持っています。 ポインタは( pun意図的)評価されるでしょう。グラハムwxpythonで複数のウィンドウを管理する

答えて

0

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

関連する問題