2012-05-15 91 views
1

我使用python 2.7和wxPython的最新版本寬x電網側。將兩個並排

我需要並排放置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

對於初學者來說,如果您將您的自定義儀到自定義面板,我認爲它使你的代碼更容易控制。看看我想出了

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) )電話不是'做太多。如果你能找到一種方法來設置列的寬度,那麼我建議你重寫initResize()到相對於面板的寬度,寬度設置。

+0

謝謝!我最需要的線是「sizer.Fit(self)」;其他技巧將在未來有用。 –