2008-10-08 5 views
2

NotebookTxtCtrl wx 위젯을 단일 프레임에 표시하고 싶습니다. 아래는 wxpython 위키에서 수정 한 예제입니다. 동일한 프레임에 Notebook 아래에 텍스트 상자를 표시하려면 레이아웃을 변경하는 것이 가능합니까 (wx.SplitterWindow과 같음)?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에 대해 자세히 알아볼 수 있습니다.

+0

이것은 매우 유용합니다. 감사합니다. DzinX – unmounted

1

스플리터를 사용할 수 있습니다. 그렇습니다.

또한 패널을 작성하고 위젯을 그 안에 배치 한 다음 (sizer를 사용하여)이 패널을 프레임에 추가하는 것이 좋습니다.

+0

위의 클래스와 관련하여 내가 어떻게 할 수 있는지에 대한 몇 가지 팁을 추가해 주시겠습니까? – unmounted