设置单元格属性会将新GridCellAttr
的添加到GridCellAttrProvider
. 随着列表的增长,查找单元格的特定属性(通过遍历列表并比较坐标)变得越来越慢。
您可以尝试通过实现自己的PyGridTableBase.SetAttr
和GetAttr
(例如使用 dict)来加速它:
编辑:更新代码以允许覆盖属性并模拟默认实现属性所有权。
class MyTable(wx.grid.PyGridTableBase):
atts = {}
def Hash(self,row,col):
#FIXME: assumes a constant number of rows and rows > cols
return col + row * self.GetNumberRows()
def SetAttr(self,attr,row,col):
HASH = self.Hash(row, col)
if HASH in self.atts:
# decrement usage count of existing attr
self.atts[HASH].DecRef()
#assign new attribute
self.atts[HASH] = attr
def GetAttr(self,row,col,kind):
HASH = self.Hash(row, col)
if HASH in self.atts:
attr = self.atts[HASH]
attr.IncRef() # increment reference count
return attr
return None
要允许设置整个行和列,您还必须实现:
def SetRowAttr(self,attr,row):
for col in range(self.GetNumberCols()):
attr.IncRef() # increment reference count for SetAttr
self.SetAttr(attr,row,col)
attr.DecRef() # attr passed to SetRowAttr no longer needed
def SetColAttr(self,attr,col):
for row in range(self.GetNumberRows()):
attr.IncRef()
self.SetAttr(attr,row,col)
attr.DecRef()
注意:当传递一个GridCellAttr
to时Set*Attr()
,默认实现将取得该属性的所有权。要重用相同的属性(例如,存储在类变量中),您必须在将其传递给方法之前Clone()
对其或增加其使用计数( ) (克隆可能会增加内存消耗)。IncRef()
Set*Attr()
上面的示例缺少适当的属性删除:SetAttr()
可以检查 None 属性并减少指定坐标处的引用计数,然后从 dict 中删除条目。
SetCol/RowAttr()
可以通过为 row 和 col 添加 dicts 来优化,类似于SetAttr()
. GetAttr()
然后可以检查行和col dict中的现有条目,并将属性与单元格dict中的属性合并/覆盖(这是默认实现使用的原则)。为了正确清理 dict(s),请DecRef
在之前调用每个条目.clear()
。
wx.grid.GridCellAttrProvider
或者,您可以从PyGridTableBase.SetAttrProvider()
. 但是,这将阻止对表的直接访问。