2016-11-14 56 views
0

我有一個有兩頁的平面筆記本。我希望在第1頁上的文本Ctrl中輸入的文本顯示在第2頁上的文本Ctrl中,並按下按鈕。當我添加'self.secondTab = SecondTab(self)'時,我得到另一個文本框疊加在第1頁上,並且文本在按鈕按下時轉移到該框。有一些我錯過的小東西,請幫忙。使用wx.flatnotebook從標籤頁轉換爲標籤頁

import wx 
import wx.lib.agw.flatnotebook as fnb 

class FirstTab(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, -1) 

     self.secondTab = SecondTab(self) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.txtOne = wx.TextCtrl(self, -1, style=wx.TE_PROCESS_ENTER) 
     self.btnOne = wx.Button(self, -1, "Transfer text to Tab 2") 
     self.Bind(wx.EVT_BUTTON, self.sendText, self.btnOne) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.txtOne, 0, wx.ALL, 5) 
     sizer.Add(self.btnOne, 0, wx.ALL, 5) 
     self.SetSizer(sizer) 

    def sendText(self, event): 
     text = self.txtOne.GetValue() 
     self.secondTab.txtTwo.WriteText(text) 

class SecondTab(wx.Panel): 
    def __init__(self, parent): 

     wx.Panel.__init__(self, parent, -1) 

     self.parent = parent 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.txtTwo = wx.TextCtrl(self, -1, style=wx.TE_PROCESS_ENTER) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.txtTwo, 0, wx.ALL, 5) 

     self.SetSizer(sizer) 

class Frame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1,"Notebook", size=(300,300)) 

     panel = wx.Panel(self) 
     notebook = wx.Notebook(panel) 

     page1 = FirstTab(notebook) 
     page2 = SecondTab(notebook) 

     notebook.AddPage(page1, "Tab 1") 
     notebook.AddPage(page2, "Tab 2") 

     sizer = wx.BoxSizer() 
     sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5) 
     panel.SetSizer(sizer) 
     self.Layout() 

if __name__ == "__main__": 
    app = wx.App() 
    frame = Frame() 
    frame.Show() 
    app.MainLoop() 
+0

我不是一個Python程序員,但在我看來,你的'高清sendText(個體經營,事件):'事件應該在'類中定義Frame' – macroland

回答

0

當你調用

self.secondTab = SecondTab(self) 

你正在構建SecondTab另一個類的實例。你不想這樣做,你想引用你在Frame中構造的實例。

global frame #reference frame constructed in main 
frame.page1.txtTwo.WriteText(text) 

當然,你需要使幀全局,所以你可以修改它。

+0

你給我太信任了。我無法弄清楚如何從tab1引用tab2的textCtrl。我在如何使框架全球化方面遇到困難。在這個問題上有許多令人困惑的帖子。如果我添加frame = Frame(),我會得到'RuntimeError:超過最大遞歸深度'。感謝您的幫助。 –

+0

https://pythonprogramming.net/global-local-variables/ – ravenspoint

0

對於任何有興趣的人,我通過使用pubsub克服了這個障礙。我跟着邁克·德里斯科爾的例子,從他的blog

import wx 
from wx.lib.pubsub import pub 

class Frame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1,"Notebook", size=(300,300)) 

     panel = wx.Panel(self) 
     notebook = wx.Notebook(panel) 

     page1 = FirstTab(notebook) 
     page2 = SecondTab(notebook) 

     notebook.AddPage(page1, "Tab 1") 
     notebook.AddPage(page2, "Tab 2") 

     sizer = wx.BoxSizer() 
     sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5) 
     panel.SetSizer(sizer) 
     self.Layout() 


class FirstTab(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, -1) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.txtOne = wx.TextCtrl(self, -1, style=wx.TE_PROCESS_ENTER) 
     self.btnOne = wx.Button(self, -1, "Transfer text to Tab 2") 
     self.Bind(wx.EVT_BUTTON, self.sendText, self.btnOne) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.txtOne, 0, wx.ALL, 5) 
     sizer.Add(self.btnOne, 0, wx.ALL, 5) 
     self.SetSizer(sizer) 

    def sendText(self, event): 
     text = self.txtOne.GetValue() 
     pub.sendMessage("panelListener", message = text) 

class SecondTab(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, -1) 
     pub.subscribe(self.myListener, "panelListener") 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.txtTwo = wx.TextCtrl(self, -1, style=wx.TE_PROCESS_ENTER) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.txtTwo, 0, wx.ALL, 5) 

     self.SetSizer(sizer) 

    def myListener(self, message): 
     self.txtTwo.WriteText(message) 

if __name__ == "__main__": 
    app = wx.App() 
    frame = Frame() 
    frame.Show() 
    app.MainLoop()