1

我有一个带有两个 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)

现在我想创建第三个笔记本页面并在某个事件上将焦点放在它上面。但这不起作用:

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

2 回答 2

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 发送事件可能是类之间最简洁的通信方式。我有几个关于这个主题的教程:

于 2013-11-04T21:44:56.873 回答
1

这应该对您有所帮助,只需单击“转到蓝色面板”按钮。

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()
于 2013-11-10T20:01:13.520 回答