セル属性を設定する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
とSet*Attr()
、デフォルトの実装が属性の所有権を取得します。同じ属性 (たとえば、クラス変数に格納されている) を再利用するには、それをメソッドに渡す前に、その属性を再利用するかClone()
、その使用回数 ( ) をインクリメントする必要があります(クローンを作成すると、メモリ消費量が増加する可能性があります)。IncRef()
Set*Attr()
上記の例では、属性が適切に削除SetAttr()
されていません。None 属性をチェックし、指定された座標で参照カウントを減らしてから、dict からエントリを削除できます。
SetCol/RowAttr()
と同様に、行と列の辞書を追加することで最適化できますSetAttr()
。GetAttr()
次に、行内の既存のエントリをチェックし、dict を照合して、属性をセル dict の属性とマージ/オーバーライドできます (これは、デフォルトの実装で使用される原則です)。dict(s) を適切にクリーンアップするには、 のDecRef
前にすべてのエントリを呼び出します.clear()
。
または、 から派生さwx.grid.GridCellAttrProvider
せてアタッチすることもできますPyGridTableBase.SetAttrProvider()
。ただし、これにより、テーブルへの直接アクセスが妨げられます。