2008-10-08 29 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

相關問題