代码之家  ›  专栏  ›  技术社区  ›  BoarGules

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

  •  0
  • BoarGules  · 技术社区  · 6 年前

    这个 docs 对于 wx.grid.GridCellEditor

    实例 wx.grid.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())
    

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

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

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

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

    0 回复  |  直到 6 年前
        1
  •  0
  •   Frank101010    6 年前

    最明显的解决方案是,一个类似“setDefaultEditorForColumn”的方法名似乎不存在。

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

    那就是那里 Grid.RegisterDataType(self, typeName, renderer, editor) 进入。

    如果只想修改其中的一个,即renderer或editor,则还可以调用 Grid.GetDefaultRendererForType() Grid.GetDefaultEditorForType() .

        2
  •  0
  •   Rolf of Saxony    5 年前

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

    • SetColformatBool(列)
    • setColformatFloat(列)
    • SetColformatNumber(列)
    • setColformatCustom(列,类型名)

    这些函数为有问题的列设置编辑器和渲染器。

        3
  •  0
  •   BoarGules    5 年前

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

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

    这一切都围绕着一个名称混乱的类 wx.grid.GridCellAttr . 可以原谅您假设name元素 Attr 基本上是指对齐和颜色,因为这就是它的含义,例如, wx.TextAttr . 这个类中最清晰的构造器是 GridCellAttr(colText, colBack, font, hAlign, vAlign) 这再次表明 阿特尔 是关于排列和颜色。

    但是这个班 wx.grid.grid单元格属性 实际上是一个非常通用的单元格属性描述符类,有超过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())