首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxNotebook和wxBoxSizer行为

wxNotebook和wxBoxSizer行为
EN

Stack Overflow用户
提问于 2013-11-04 21:30:48
回答 2查看 354关注 0票数 1

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

代码语言:javascript
复制
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)

现在,我想创建第三个笔记本页面&在某一特定事件中集中精力关注它。但这是行不通的:

代码语言:javascript
复制
def CreateNewPageEvent(self, event):
    self.CreateNewPage()

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

我必须承认,我不知道"BoxSizer“=/有什么想法能让这件事奏效吗?

编辑:好的,这适用于我的大型机类中的一个事件。但我还想从另一个类的事件中创建一个新的nb页面:

代码语言:javascript
复制
class ContinueApp(MainFrame):
    def foo(self):
        super(ContinueApp, self).CreateNewPage()

def continueapp(event):
    cont = ContinueApp()
    cont.foo()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-04 21:44:56

BoxSizer (和其他sizer)是用来布局小部件的,所以您不必自己定位它们。当您使应用程序窗口更大或更小时,它们还有助于控制哪些小部件展开或扩展。在您的示例中,不应该向同一个sizer添加两次相同的小部件。您也不应该将一个小部件添加到两个不同的sizer中。

您需要删除以下内容:

代码语言:javascript
复制
self.nb.AddPage(page1, "page3")
self.sizer.Add(self.nb, 1, wx.EXPAND)
self.p.SetSizer(self.sizer)

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

代码语言:javascript
复制
page3 = PageThree(self.nb)
self.nb.AddPage(page3, "page3")

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

一旦切换了选项卡,您可能希望将焦点设置在该选项卡中的一个小部件上。我发现使用pubsub发送事件可能是类间最干净的通信方式。我有几本关于这个主题的教程:

  • 用于早期版本的wxPython 2.8 - http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/
  • 适用于wxPython 2.8和所有2.9 - http://www.blog.pythonlibrary.org/2013/09/05/wxpython-2-9-and-the-newer-pubsub-api-a-simple-tutorial/的更高版本
票数 3
EN

Stack Overflow用户

发布于 2013-11-10 20:01:13

这将帮助您,只需单击"GoTo蓝面板“按钮。

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19777527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档