我有一个网格应用程序,例如,列可以标记为超级重要。完成后,我使用Grid.SetColAttr
更改列的颜色。但是,当用户删除该标志时,我似乎无法撤消SetColAttr
。使用None
而不是属性对象再次调用它会导致Python神秘地崩溃而没有错误消息,并且迭代所有单元格并调用SetAttr(row, col, None)
对列的颜色没有影响。我想这是因为列属性在None
时会覆盖单元格属性。
那么如何撤消单元格属性更改?我假设我必须使用“默认”网格属性调用SetColAttr
,但我甚至不知道网格是否具有默认的单元属性或如何获取它。
答案 0 :(得分:1)
问题出在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
答案 1 :(得分:0)
您可以获取默认的单元格背景颜色和文本颜色和字体(GetDefaultCellFont,GetDefaultCellBackgroundColour等)并根据它进行设置。我找不到任何东西来获得列的默认值attr。也许通过抓取单元格的默认值,您可以使用它们来设置列的。
我也找到了这个有点相关的简洁答案,可能会帮助你解决这个问题:
Fade in/out the background color of wxpython grid cell
你还应该阅读wxPython wiki上的wxGrid wiki页面:http://wiki.wxpython.org/wxGrid