并排放置两个wx网格

时间:2012-05-15 15:22:49

标签: python grid wxpython wxwidgets

我正在使用python 2.7和最新版本的wxpython。

我需要并排放置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 个答案:

答案 0 :(得分: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

使用Panel而不是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))调用并没有做太多。如果你能找到一种方法来设置列的宽度,那么我建议你重写initResize()来设置相对于面板宽度的宽度。