2013-11-04 14 views
1

我有兩個wxNotebook元素象這樣的GUI:wxNotebook和wxBoxSizer行爲

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "My App",size=(800,600),pos=((wx.DisplaySize()[0]-800)/2,(wx.DisplaySize()[1]-600)/2),style= wx.SYSTEM_MENU | wx.CAPTION | wx.MINIMIZE_BOX | wx.CLOSE_BOX) 

     self.SetBackgroundColour((232,232,232)) 
     self.p = wx.Panel(self,size=(800,6300),pos=(0,0)) 
     self.SetPages() 

    def SetPages(self): 
     self.nb = wx.Notebook(self.p,style=wx.NB_BOTTOM) 
     page1 = PageOne(self.nb) 
     page2 = PageTwo(self.nb) 
     self.nb.AddPage(page1, "page1") 
     self.nb.AddPage(page2, "page2") 
     self.sizer = wx.BoxSizer() 
     self.sizer.Add(self.nb, 1, wx.EXPAND) 
     self.p.SetSizer(self.sizer) 

現在我想在特定事件創建第三&筆記本頁面設置聚焦。但是,這並不工作:

def CreateNewPageEvent(self, event): 
    self.CreateNewPage() 

def CreateNewPage(self): 
    page3 = PageThree(self.nb) 
    self.nb.AddPage(page3, "page3") 

我必須承認,我不知道什麼是「BoxSizer」確實=/ 任何想法得到這個工作?

編輯:好的,這適用於我的MainFrame類中的事件。但我也想從另一個類的事件創建一個新的NB-頁:

class ContinueApp(MainFrame): 
    def foo(self): 
     super(ContinueApp, self).CreateNewPage() 

def continueapp(event): 
    cont = ContinueApp() 
    cont.foo() 
+0

這有點像xml中的T​​ableLayout,如果有幫助的話。或者像一張放入其中的桌子。無論是列(垂直大小)或行(水平)。你可以組合它們或使用'GridBagSizer'。 –

回答

3

的BoxSizer(和其他施膠劑)是用於鋪設小部件,所以你不必給他們定位自己。他們還可以幫助您控制哪些小部件在您的應用程序窗口變大或變小時擴展或拉伸。在你的情況下,你不應該將同一個小部件添加到同一個sizer兩次。您不應該將一個小部件添加到兩個不同的sizer。

您需要刪除此:

self.nb.AddPage(page1, "page3") 
self.sizer.Add(self.nb, 1, wx.EXPAND) 
self.p.SetSizer(self.sizer) 

另外請注意,您再次加入第1頁到筆記本電腦時,你應該加入第3頁:

page3 = PageThree(self.nb) 
self.nb.AddPage(page3, "page3") 

如果你想程序選項卡之間進行切換,你應該使用筆記本的SetSelection方法。我有一個示例應用程序,你可以看看下面的教程(或它下面的答案):

一旦切換標籤,你可能要設置關注該選項卡中的小部件。我發現使用pubsub發送事件可能是最簡單的類間通信方式。我對這個問題的一對夫婦教程:

+0

謝謝!這解決了我的問題的一部分。但是,我剛剛在我的啓動文章中編輯過,還有另一個問題。附:與「打印調試」我可以看到「CreateNewPage」從我的其他類被調用 - 但沒有出現nb頁。 – Munchkin

+0

那麼這就是pubsub進來的地方。在你的MainFrame類中創建一個監聽器,它將調用你的CreateNewPage方法。然後在您的ContinueApp中,您可以發佈到該事件。請參閱我答案中的pubsub鏈接以獲取示例。 –

1

這會幫助你,只需點擊「GoTo Blue Panel」按鈕。

import wx 
import wx.lib 
import wx.lib.flatnotebook as FNB 

class MyFlatNotebook(FNB.FlatNotebook): 
    def __init__(self, parent): 
     mystyle = FNB.FNB_DROPDOWN_TABS_LIST|\ 
     FNB.FNB_FF2|\ 
     FNB.FNB_SMART_TABS|\ 
     FNB.FNB_X_ON_TAB 
     super(MyFlatNotebook, self).__init__(parent, style=mystyle) 
     # Attributes 
     self.textctrl = wx.TextCtrl(self, value="edit me", style=wx.TE_MULTILINE) 
     self.blue = wx.Panel(self) 
     self.blue.SetBackgroundColour(wx.BLUE) 

     # Setup 
     self.AddPage(self.textctrl, "Text Editor") 
     self.AddPage(self.blue, "Blue Panel") 

class MyFrame(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title) 

     # Make some buttons 
     vbox = wx.BoxSizer(wx.VERTICAL) 
     hbox = wx.BoxSizer(wx.HORIZONTAL) 
     button = wx.Button(self, wx.ID_OK, "GoTo Blue Panel") 
     self.Bind(wx.EVT_BUTTON, self.OnButton, button) 

     hbox.Add(button, 0, wx.ALL, 5) 
     self.nb = MyFlatNotebook(self) 
     vbox.Add(hbox, 0, wx.EXPAND) 
     vbox.Add(self.nb, 1, wx.EXPAND) 
     self.SetSizer(vbox) 

    def OnButton(self, event): 
     self.nb.SetSelection(1) 



if __name__=='__main__': 
    app = wx.App(False) 
    frame = MyFrame(None, -1, "NoteTest") 
    frame.Show() 
    app.MainLoop()