【问题标题】:How do I undo wx.grid.Grid.SetColAttr?如何撤消 wx.grid.Grid.SetColAttr?
【发布时间】:2013-01-08 09:23:06
【问题描述】:

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

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

【问题讨论】:

    标签: python wxpython wxwidgets


    【解决方案1】:

    问题仅限于SetColAttrSetRowAttrSetAttr(row,col,None) 有效(重置单个单元格)。但是,由于这些属性存储在不同的列表中(单元格/行/列),SetAttr() 对列或行属性没有影响。

    在内部,wxGridTableBase::SetColAttr() 尝试分配属性的种类 (wxGridCellAttr::SetKind()) 到提供的参数。在None 的情况下,它会尝试调用 None 对象(实际上是空指针)上的方法,从而导致崩溃。

    您可以通过直接在 wxGridCellAttrProvider 上调用 SetColAttr() 来绕过该分配(这也将绕过对有效 GridCellAttrProvider 的检查,并且不会清除属性缓存):

    self.grid.GetTable().GetAttrProvider().SetColAttr(None,column)
    

    这可能会在属性缓存中留下痕迹,导致单元格未被重置。清除缓存,调用SetAttr()

    self.grid.SetAttr(-1,-1,None) # use invalid coordinates
    

    【讨论】:

      【解决方案2】:

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

      我还发现了这个有点相关的简洁答案,可能会帮助您弄清楚:

      Fade in/out the background color of wxpython grid cell

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

      【讨论】:

        猜你喜欢
        • 2021-06-01
        • 2014-04-12
        • 1970-01-01
        • 2019-12-11
        • 2014-11-06
        • 2010-12-06
        • 2023-03-24
        • 2019-08-23
        • 2015-06-05
        相关资源
        最近更新 更多