wxPython在面板中重新加载网格

时间:2014-04-17 15:50:39

标签: python-2.7 wxpython

我有几个课程,所以我不想在这里粘贴任何代码(如果可能的话:P)

问题: 我创建了一个创建框架的类,这个框架包含一个面板。 在另一个课程中,我已存储了所有设置。

在面板上有几个sizer和其他属性,它有一个网格。 该网格从x轴上的序列1和y轴上的序列y构建​​。

要创建我的面板,我将我的代码划分为多个部分(如buildLeft()buildRight()buildTopRight()等,这些部分链接到buildFrame()方法中的主sizer)。

我的网格是在此类的buildTopRight()部分中创建的。它通过从设置对象检索sequence1和sequence2的值来创建网格,并相应地创建该序列长度的网格。完成此操作后,网格将绑定到topRight部分的sizer。

我还有一个下拉列表(wx.Choice)。如果我从此列表中选择另一个选项,我想从序列1和序列2中删除一个项目。 执行此操作的代码已经生效,我的设置对象中的数据也会相应更改。

但是,我无法重新加载矩阵,因为如果我再次调用buildTopRight()方法,则会重新创建矩阵并将其裁剪到屏幕的左侧,同时保留旧矩阵。

请帮忙。

根据要求,这是构建我的面板的代码:

# import modules
import wx
import wx.grid
import matrixSettings as ms

# Panel class
class ResultatenPanel(wx.Panel):
def __init__(self, parent, id):
    wx.Panel.__init__(self, parent, id, style=wx.BORDER_SUNKEN)

    # link settings object
    self.matSet = self.GetGrandParent().ms

    # build the main sizers
    self.sizerMain = wx.BoxSizer(wx.HORIZONTAL)
    self.sizerMenu = wx.BoxSizer(wx.VERTICAL)
    self.sizerRight = wx.BoxSizer(wx.VERTICAL)
    self.sizerTopRight = wx.BoxSizer(wx.HORIZONTAL)
    self.sizerBotRight = wx.BoxSizer(wx.HORIZONTAL)

    # make individual parts
    self.buildMenu()
    self.buildTopRight()
    self.buildBotRight()
    self.buildRight()

    # build total frame
    self.buildFrame()

构建正确的代码(包括右上角和右下角):

def buildRight(self):
    self.sizerRight.Add(self.sizerTopRight, 5)
    self.sizerRight.Add(self.sizerBotRight, 2)

构建框架的代码:

def buildFrame(self):
    self.sizerMain.Add(self.sizerMenu, 1)
    self.sizerMain.Add(self.sizerRight, 5, wx.EXPAND)
    self.SetSizer(self.sizerMain)

右上角代码:

def buildTopRight(self):
    self.grid = wx.grid.Grid(self)

    print "buildTopRight called"
    if self.matSet.getAlgoritme() == "Needleman-Wunsch":
        self.matSet.setSeq1("-" + self.matSet.getSeq1())
        self.matSet.setSeq2("-" + self.matSet.getSeq2())

    # set grid
    self.grid.CreateGrid(len(self.matSet.getSeq2()), len(self.matSet.getSeq1()))
    self.grid.SetRowLabelSize(25)
    self.grid.DisableDragColSize()
    self.grid.DisableDragRowSize()

    # set the grid proportions accurately
    for x in range(0, len(self.matSet.getSeq1())):
        # set the grid proportions accurately
        for y in range(0, len(self.matSet.getSeq2())):
            self.grid.SetRowSize(y, 25)
            self.grid.SetRowLabelValue(y, self.matSet.getSeq2()[y].upper())

            self.grid.SetCellValue(y, x, "0")
            self.grid.SetReadOnly(y, x, True)

        self.grid.SetColSize(x, 25)
        self.grid.SetColLabelValue(x, self.matSet.getSeq1()[x].upper())

新添加:

    self.sizerTopRight.Clear()    
    self.sizerTopRight.Add(self.grid, 1)

    self.Update()
    self.Layout()

1 个答案:

答案 0 :(得分:1)

我知道这是一个不太友好的解决方案。 您应该隐藏当前网格并创建一个新网格:

self.sizerTopRight.Hide(self.grid)
self.sizerTopRight.Add(self.new_grid, 1)
self.sizerTopRight.Show(self.new_grid)
self.Layout()