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

时间:2019-02-23 16:57:59

标签: python wxpython

wx.grid.GridCellEditor的{​​{3}}说

  

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

因为如果我向网格中添加行(这是一种常见的操作),那么在我再次进行专门设置​​之前,新行将没有编辑器。

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

文档清楚地表明,我不必使用任何一种解决方法。但是它也没有提供(至少在我能找到的任何地方)另一种方法。

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

3 个答案:

答案 0 :(得分:0)

对此最明显的解决方案是,似乎不存在类似“ SetDefaultEditorForColumn”之类的方法名称。

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

这就是Grid.RegisterDataType(self, typeName, renderer, editor)的输入位置。

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

答案 1 :(得分:0)

该功能不是由以下人员执行的吗? :

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

这些功能为相关列设置了编辑器和渲染器。

答案 2 :(得分:0)

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

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

所有这些都围绕着令人困惑的命名类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)

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

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