Py学习  »  Python

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

BoarGules • 6 年前 • 1568 次点击  

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

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

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

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40757
 
1568 次点击  
文章 [ 3 ]  |  最新文章 6 年前
BoarGules
Reply   •   1 楼
BoarGules    6 年前

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

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

这一切都围绕着一个名称混乱的类 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())
Rolf of Saxony
Reply   •   2 楼
Rolf of Saxony    6 年前

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

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

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

Frank101010
Reply   •   3 楼
Frank101010    6 年前

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

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

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

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