1

我正在使用 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()
4

1 回答 1

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())

最后,据我所知, Grid 中的列具有固定宽度,因此您的 matrix.SetSize((500, 500)) 调用 ant' 做很多事情。如果你能找到一种方法来设置列的宽度,那么我建议你重写 initResize() 来设置相对于面板宽度的宽度。

于 2012-05-16T01:41:43.627 回答