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

wxPython - How to set an editor for a column of a grid

docs 对于 wx.grid.GridCellEditor

Instances of wx.grid.GridCellEditor ... can be associated with the cell attributes for individual cells, rows, columns, or even for the entire grid.

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

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())

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

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

文档清楚地暗示我不必求助于任何一种解决方法。但它也没有提供(至少我能找到的任何地方)另一种方法。

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

对此最明显的解决方案,类似 "SetDefaultEditorForColumn" 的方法名称似乎并不存在。

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

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

如果您只想修改两者之一,渲染器或编辑器,您可能还想调用 Grid.GetDefaultRendererForType()Grid.GetDefaultEditorForType()

那个功能不是由下面的执行的吗? :

  • SetColFormatBool(col)
  • SetColFormatFloat(列)
  • SetColFormatNumber(col)
  • SetColFormatCustom(col, typeName)

这些函数为相关列设置编辑器和渲染器。

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

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

这一切都围绕着令人困惑的名字 class wx.grid.GridCellAttr。您可能会假设名称元素 Attr 本质上表示对齐和颜色,因为这就是它在 wx.TextAttr 中的含义。 class 最清楚的构造函数是 GridCellAttr(colText, colBack, font, hAlign, vAlign),这再次表明 Attr 是关于对齐和颜色的。

但是 class wx.grid.GridCellAttr 实际上是一个非常通用的单元格属性描述符 class 有超过 30 种方法用于设置和获取对齐方式和颜色,正如预期的那样,而且(除其他外) things) 大小,read/write 模式,渲染器,和 editor.

那么为网格的列设置编辑器的方法是

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())