【问题标题】:wxPython Reload a grid in a panelwxPython 在面板中重新加载网格
【发布时间】:2014-04-17 15:50:39
【问题描述】:

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

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

面板上有几个尺寸器和其他属性,它有一个网格。 这个网格是从 x 轴上的序列 1 和 y 轴上的序列 y 构建的。

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

我的网格是在这个类的 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()

【问题讨论】:

  • 如果不至少查看 build* 方法的函数体,就无法在此处诊断您的问题。
  • 你在 self.sizerTopRight 的什么地方添加东西?
  • 抱歉,我似乎忘了从 buildTopRight 方法中添加一些代码。使用此代码,网格似乎确实有效(在某种程度上)。网格已更新,但如果创建了新的更小的网格,则不会删除旧网格。它只是简单地绘制在旧网格上,这意味着如果您从网格中删除一个项目并使用刷新按钮,新的(较小的)网格将放置在旧网格上,留下 1 个“旧”行和列。我仍在尝试删除此列。

标签: python-2.7 wxpython


【解决方案1】:

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

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

【讨论】:

  • 那么以这种方式创建网格和 new_grid 的最佳方法是什么?我已经有一个网格对象,并通过以下代码在 buildTopRight 方法中重新创建一个:“self.grid = wx.grid.Grid(self)”
  • 我在程序中添加了 try: self.sizerTopRight.Hide(self.grid) except: print "no grid build yet"。并添加了您建议的 .Add 和 .Show 方法。现在完美运行,谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多