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をカスタムPanelに変換すると、コードの制御がはるかに簡単になると思います。私が思いついたものを見てください

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の代わりにPanelを使用すると、「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()を書き直して、パネルの幅を基準にした幅を設定することをお勧めします。

于 2012-05-16T01:41:43.627 に答える