2012-05-15 6 views
1

저는 파이썬 2.7과 wxpython의 최신 버전을 사용하고 있습니다.2 개의 wx 그리드를 나란히 나란히 배치

2 개의 격자를 나란히 배치하고 동적으로 행을 추가 할 수 있어야합니다. 이상적으로 그리드의 크기는 동적으로 커야하지만 당분간은 충분히 커야합니다.

내 코드를 어떻게 변경 (및 단순화)해야합니까?

class MatricesFrame(wx.BoxSizer):   
    def __init__(self, parentPanel): 
     super(MatricesFrame, self).__init__(wx.HORIZONTAL) 

     self.outputsMatrix = self.addEmptyGrid(parentPanel) 
     self.inputsMatrix = self.addEmptyGrid(parentPanel) 

     addRowsButton = wx.Button(parentPanel, -1, " Add Rows") 
     addRowsButton.Bind(wx.EVT_BUTTON, self.addRows) 
     self.Add(addRowsButton) 

    def initResize(self, ev = None): 
     self.inputsMatrix.SetSize((500, 500)) 
     self.outputsMatrix.SetSize((500, 500)) 

    def addEmptyGrid(self, parentPanel): 
     panel_ = wx.Panel(parentPanel) 
     sizer_ = wx.BoxSizer(wx.VERTICAL) 
     panel_.SetSizer(sizer_) 
     panel_.SetSize((500, 500)) 
     matrix_ = wx.grid.Grid(panel_) 
     matrix_.SetRowLabelSize(0) 
     matrix_.SetColLabelSize(0) 
     matrix_.CreateGrid(1,1) 
     sizer_.Add(matrix_) 
     self.Add(panel_) 
     return matrix_ 

    def addRows(self, ev=None): 
     self.inputsMatrix.AppendRows(1) 
     self.outputsMatrix.AppendRows(1) 

class TestFrame(wx.Frame): 
    def __init__(self, parent): 
     super(TestFrame, self).__init__(parent, title='test', size=(1280, 950))    
     panel = wx.Panel(self) 
     box = wx.BoxSizer(wx.VERTICAL) 
     self.matricesFrame = MatricesFrame(panel)  
     box.Add(self.matricesFrame) 
     panel.SetSizer(box) 
     self.matricesFrame.initResize() 
     self.Centre() 
     self.Show() 
     self.matricesFrame.initResize() 
     wx.EVT_IDLE(wx.GetApp(), wx.WakeUpIdle())   

def main(): 
    app = wx.App(False) 
    t= TestFrame(None) 
    app.MainLoop() 

if __name__ == '__main__': 
    main() 

답변

1

처음에는 사용자 지정 Sizer를 사용자 지정 패널로 변환하면 코드를 훨씬 쉽게 제어 할 수 있다고 생각합니다. 내가

class MatricesPanel(wx.Panel):   
    def __init__(self, parent): 
     super(MatricesPanel, self).__init__(parent) 

     sizer = wx.BoxSizer(wx.HORIZONTAL) 

     self.outputsMatrix = self.addEmptyGrid(sizer) 
     self.inputsMatrix = self.addEmptyGrid(sizer) 

     addRowsButton = wx.Button(self, -1, " Add Rows") 
     addRowsButton.Bind(wx.EVT_BUTTON, self.addRows) 
     sizer.Add(addRowsButton) 

     self.SetSizer(sizer) 
     self.SetAutoLayout(True) 
     self.Layout() 

    def initResize(self, ev = None): 
     self.inputsMatrix.SetSize((500, 500)) 
     self.outputsMatrix.SetSize((500, 500)) 
     self.Layout() 

    def addEmptyGrid(self, sizer): 
     matrix_ = wx.grid.Grid(self) 
     matrix_.SetRowLabelSize(0) 
     matrix_.SetColLabelSize(0) 
     matrix_.CreateGrid(1,1) 
     sizer.Add(matrix_) 
     return matrix_ 

    def addRows(self, ev=None): 
     self.inputsMatrix.AppendRows(1) 
     self.outputsMatrix.AppendRows(1) 
     self.Layout() #refresh the frame 

은 크게 "addEmptyGrid"방법을 단순화하는 대신 크기 조절기 당신의 패널 작업뿐만 아니라 이제 당신의 크기를 사용하여 matricies의 크기를 설정을 시도 할 수 있습니다 해낸에서보세요 패널 자체의 크기가 아닙니다. 또한 스크롤 막대를 추가하려는 경우 wx.Panel에서 wx.lib.scrolledpanel.ScrolledPanel로 유연하게 변경할 수 있습니다 (많은 행을 추가하는 경우).

그런 다음 아래와 같이 새로운 패널을 초기화하기 수

class TestFrame(wx.Frame): 
    def __init__(self, parent): 
     super(TestFrame, self).__init__(parent, title='test', size=(1280, 950)) 
     self.matricesPanel = MatricesPanel(self) 

     sizer = wx.BoxSizer() 
     sizer.Add(self.matricesPanel, flag=wx.EXPAND) 
     self.SetSizer(sizer) 

     self.Centre() 
     self.Show() 
     self.matricesPanel.initResize() 

     wx.EVT_IDLE(wx.GetApp(), wx.WakeUpIdle()) 

마지막으로, 지금까지 내가 말할 수있는, 그리드의 열은 고정 폭, 그래서 당신의 matrix.SetSize ((500, 500)) 많이하지 않는 전화 arent. 열 너비를 설정하는 방법을 찾을 수 있다면 initResize()를 다시 작성하여 패널 너비를 기준으로 너비를 설정하는 것이 좋습니다.

+0

감사합니다. 내가 가장 필요로했던 것은 "sizer.Fit (self)"였습니다. 다른 팁은 앞으로 유용 할 것입니다. –

관련 문제