2008-10-08 49 views
2

我希望能够在单个帧中显示NotebookTxtCtrl wx小部件。下面是一个从wxpython wiki改编的例子;是否可以更改它们的布局(可能使用类似wx.SplitterWindow的东西)以在同一帧中显示Notebook下面的文本框?wxPython:在同一帧中显示多个小部件

import wx 
import wx.lib.sheet as sheet 

class MySheet(sheet.CSheet): 
    def __init__(self, parent): 
     sheet.CSheet.__init__(self, parent) 

     self.SetLabelBackgroundColour('#CCFF66') 
     self.SetNumberRows(50) 
     self.SetNumberCols(50) 


class Notebook(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, size=(600, 600)) 
     menubar = wx.MenuBar() 
     file = wx.Menu() 
     file.Append(101, 'Quit', '') 
     menubar.Append(file, "&File") 
     self.SetMenuBar(menubar) 
     wx.EVT_MENU(self, 101, self.OnQuit) 
     nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM) 
     self.sheet1 = MySheet(nb) 
     self.sheet2 = MySheet(nb) 
     self.sheet3 = MySheet(nb) 
     nb.AddPage(self.sheet1, "Sheet1") 
     nb.AddPage(self.sheet2, "Sheet2") 
     nb.AddPage(self.sheet3, "Sheet3") 
     self.sheet1.SetFocus() 
     self.StatusBar() 

    def StatusBar(self): 
     self.statusbar = self.CreateStatusBar() 

    def OnQuit(self, event): 
     self.Close() 


class MyFrame(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(450, 400)) 
     self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE) 
     self.Center() 

class MyApp(wx.App): 
    def OnInit(self): 
     frame = Notebook(None, -1, 'notebook.py') 
     frame.Show(True) 
     frame.Center() 
     frame2 = MyFrame(None, -1, '') 
     frame2.Show(True) 
     self.SetTopWindow(frame2) 
     return True 


app = MyApp(0) 
app.MainLoop() 

回答

8

实际上,让两个小部件出现在同一个框架上很容易。你应该使用sizer来完成这个。

在你的榜样,你可以改变你Notebook类实现的东西是这样的:

class Notebook(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, size=(600, 600)) 
     menubar = wx.MenuBar() 
     file = wx.Menu() 
     file.Append(101, 'Quit', '') 
     menubar.Append(file, "&File") 
     self.SetMenuBar(menubar) 
     wx.EVT_MENU(self, 101, self.OnQuit) 
     nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM) 
     self.sheet1 = MySheet(nb) 
     self.sheet2 = MySheet(nb) 
     self.sheet3 = MySheet(nb) 
     nb.AddPage(self.sheet1, "Sheet1") 
     nb.AddPage(self.sheet2, "Sheet2") 
     nb.AddPage(self.sheet3, "Sheet3") 
     self.sheet1.SetFocus() 
     self.StatusBar() 
     # new code begins here: 
     # add your text ctrl: 
     self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE) 
     # create a new sizer for both controls: 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     # add notebook first, with size factor 2: 
     sizer.Add(nb, 2) 
     # then text, size factor 1, maximized 
     sizer.Add(self.text, 1, wx.EXPAND) 
     # assign the sizer to Frame: 
     self.SetSizerAndFit(sizer) 

只有__init__方法改变。请注意,您可以通过更改Add方法的第二个参数来操纵笔记本和文本控件之间的比例。

您可以从官方Sizer overview文章中了解更多关于sizer的信息。

+0

这非常有帮助,谢谢DzinX – unmounted 2008-10-08 07:24:01

1

你可以使用分离器,是的。

此外,创建一个面板,放置你的小部件(sizers),并将这个面板添加到框架是有意义的。

+0

你可以添加一些关于如何参考上述类的提示吗? – unmounted 2008-10-08 06:57:36

相关问题