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