wxpython-如何为网格列设置编辑器



wx.grid.GridCellEditor Say

的文档

wx.grid.GridCellEditor的实例...可以与单个单元格,行,列甚至整个网格的单元格属性相关联。

现在,我知道如何将编辑器与单元格关联:

self.mygrid.SetCellEditor(row, 1, wx.grid.GridCellEditorSubclass())

我知道如何将编辑器与整个网格相关联:

self.mygrid.SetDefaultEditor(wx.grid.GridCellEditorSubclass())

,但我不知道如何为单列设置编辑器。这个明显的解决方法不是一个好的解决方案:

for row in range(nrows):
    self.mygrid.SetCellEditor(row, 1, wx.grid.GridCellEditorSubclass())

因为如果我在网格中添加行(这是一个常见的操作),那么新行才具有编辑器,直到我再次专门设置它。

另一个明显的解决方法是将通用编辑器类与整个网格相关联,并根据列号在运行时实例化特定于列的编辑器。

文档显然意味着我不必求助于任何一个解决方法。但这也无法(至少在我能找到的任何地方)提供另一种方法。

那么,问题是,如何为整个网格列设置编辑器?

最明显的解决方案,一种方法名称" setDefaulteditorforcolumn"似乎不存在。

,但我认为网格的想法是指定数据类型的编辑器,而不是单列。这样,您可以在网格中具有多个具有相同数据类型的列并使用相同的编辑器。

这就是Grid.RegisterDataType(self, typeName, renderer, editor)进入的地方。

如果您只想修改两个渲染器或编辑器之一,则可能还需要致电Grid.GetDefaultRendererForType()Grid.GetDefaultEditorForType()

这不是由以下功能执行吗?:

  • setColformatbool(col)
  • setColformatfloat(col)
  • setColformatnumber(col)
  • setColformatcustom(col,typeName)

这些函数设置了有关列的编辑器和渲染器。

其他两个答案中的方法是创建数据类型,将编辑器与数据类型相关联,然后将数据类型与列相关联。如果您具有具有相同数据类型的多个列,则将编辑器与列号与列号相关,因此这些解决方案可能是最佳的通用方法。

,但我想要一种更简单的方法,将编辑器与特定列相关联,因为在我的应用程序中,每个列都是不同的数据类型。跨列共享数据类型是没有意义的。因此,这个答案与原始问题更接近。

所有这些都围绕着令人困惑的命名类wx.grid.GridCellAttr。假设名称元素 Attr本质上意味着对齐和颜色,您可能会被原谅,因为这就是例如wx.TextAttr的含义。此类最清晰记录的构造函数是GridCellAttr(colText, colBack, font, hAlign, vAlign),这再次表明Attr与对齐和颜色有关。

但是,类wx.grid.GridCellAttr实际上是一个非常通用的单元格属性类别类别,具有超过30种用于设置和保持对齐和颜色的方法,如预期的,以及(除其他外)大小,读取/写入模式,渲染器和编辑

因此,设置网格列的编辑器的方法为

my_col_property_settings = wx.grid.GridCellAttr()
my_col_property_settings.SetEditor(MyColumnSpecificEditor())
my_col_property_settings.SetAlignment(hAlign=wx.ALIGN_CENTRE, vAlign=wx.ALIGN_CENTRE)
# ... etc ...
self.mygrid.SetColAttr(1, my_col_property_settings)

但是,如果要为两个列设置相同的编辑器,请不要以GridCellAttr的相同实例调用SetColAttr(),因为如果这样做,您将在程序关闭时获得参考计数错误。而是做

self.mygrid.SetColAttr(1, my_col_property_settings.Clone())
self.mygrid.SetColAttr(2, my_col_property_settings.Clone())

最新更新