如何撤消wx.grid.Grid.SetColAttr?

时间:2013-01-08 09:23:07

标签: python wxpython wxwidgets

我有一个网格应用程序,例如,列可以标记为超级重要。完成后,我使用Grid.SetColAttr更改列的颜色。但是,当用户删除该标志时,我似乎无法撤消SetColAttr。使用None而不是属性对象再次调用它会导致Python神秘地崩溃而没有错误消息,并且迭代所有单元格并调用SetAttr(row, col, None)对列的颜色没有影响。我想这是因为列属性在None时会覆盖单元格属性。

那么如何撤消单元格属性更改?我假设我必须使用“默认”网格属性调用SetColAttr,但我甚至不知道网格是否具有默认的单元属性或如何获取它。

2 个答案:

答案 0 :(得分:1)

问题出在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

答案 1 :(得分:0)

您可以获取默认的单元格背景颜色和文本颜色和字体(GetDefaultCellFont,GetDefaultCellBackgroundColour等)并根据它进行设置。我找不到任何东西来获得列的默认值attr。也许通过抓取单元格的默认值,您可以使用它们来设置列的。

我也找到了这个有点相关的简洁答案,可能会帮助你解决这个问题:

Fade in/out the background color of wxpython grid cell

你还应该阅读wxPython wiki上的wxGrid wiki页面:http://wiki.wxpython.org/wxGrid