我有一个网格应用程序,其中列可以被标记为超级重要。完成后,我使用Grid.SetColAttr
更改列的颜色。但是,当用户删除标志时,我似乎无法撤消SetColAttr
。用None
而不是attribute对象再次调用它会导致Python神秘地崩溃,没有错误消息,并且迭代所有单元格并调用SetAttr(row, col, None)
对列的颜色没有影响。我想这是因为column属性在None
时会覆盖cell属性。
那么,如何撤消单元格属性更改?我想我必须用“default”网格属性调用SetColAttr
,但我甚至不知道网格是否有默认的单元格属性或如何获取它。
最佳答案
问题只与SetColAttr
和SetRowAttr
有关。SetAttr(row,col,None)
工作(重置单个单元格)。但是,由于这些属性存储在不同的列表(单元格/行/列)中,SetAttr()
对列或行属性没有影响。
在内部,wxGridTableBase::SetColAttr()
尝试分配属性的类型
(wxGridCellAttr::SetKind()
)
提供的参数。在None
的情况下,它尝试对None对象(实际上是空指针)调用方法,这会导致崩溃。
您可以通过直接在SetColAttr()
上调用wxGridCellAttrProvider
来绕过该分配(这也将绕过对有效GridCellAttrProvider的检查,并且不会清除属性缓存):
self.grid.GetTable().GetAttrProvider().SetColAttr(None,column)
这可能会在属性缓存中留下跟踪,从而导致单元未重置。要清除缓存,请调用
SetAttr()
:self.grid.SetAttr(-1,-1,None) # use invalid coordinates