2012-05-15 2 views
1

Я использую python 2.7 и последнюю версию wxpython.Размещение двух wx-сеток рядом друг с другом

Мне нужно разместить две сетки бок о бок и динамически добавлять строки. В идеале размеры сеток должны динамически расти, но размер «достаточно большой» должен быть в порядке.

Как мне изменить (и упростить) мой код, чтобы это произошло?

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 

Работы с панелью вместо Sizer вам значительно упростить метод «addEmptyGrid», а также теперь вы можете попробовать установить размер ваших матриц, используя размер самого панель, а не размер самих матриц. Кроме того, это позволяет вам гибко переключаться с 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)»; другие советы будут полезны в будущем. –