wxNotebook和wxBoxSizer的行为

时间:2013-11-04 21:30:48

标签: python wxpython

我有一个带有两个wxNotebook元素的GUI,如下所示:

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)

现在我想创建第三个Notebook-page&在特定事件中集中关注它。但这不起作用:

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

2 个答案:

答案 0 :(得分:3)

BoxSizer(和其他大小调整器)用于布置小部件,因此您无需自己定位。当您使应用程序窗口变大或变小时,它们还可以帮助控制哪些窗口小部件展开或拉伸。在您的情况下,您不应该将同一个窗口小部件添加到同一个sizer中两次。您不应该将一个小部件添加到两个不同的大小调整器中。

您需要删除此内容:

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

另请注意,当您应添加page3时,您将再次将page1添加到笔记本中:

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

如果要以编程方式在选项卡之间切换,则应使用笔记本的SetSelection方法。我有一个示例应用程序,你可以在下面的教程(或下面的答案)中看到:

切换标签后,您可能希望将焦点设置在该标签内的小部件上。我发现使用pubsub发送事件可能是类之间最清晰的通信方式。我有几个关于这个主题的教程:

答案 1 :(得分: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()