我有一个网格应用程序,其中列可以被标记为超级重要。完成后,我使用Grid.SetColAttr更改列的颜色。但是,当用户删除标志时,我似乎无法撤消SetColAttr。用None而不是attribute对象再次调用它会导致Python神秘地崩溃,没有错误消息,并且迭代所有单元格并调用SetAttr(row, col, None)对列的颜色没有影响。我想这是因为column属性在None时会覆盖cell属性。
那么,如何撤消单元格属性更改?我想我必须用“default”网格属性调用SetColAttr,但我甚至不知道网格是否有默认的单元格属性或如何获取它。

最佳答案

问题只与SetColAttrSetRowAttr有关。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

07-24 18:13