【问题标题】:wxpython wxgrid attributeswxpython wxgrid 属性
【发布时间】:2015-08-29 10:19:17
【问题描述】:

我无法突出显示网格中的替代行。创建网格并用数据填充后,突出显示替代行按预期工作。但是当加载新数据时,我删除所有行,然后根据需要添加新行,这一次网格突出显示引发异常未处理的 TypeError。这让我很难过——有什么建议吗? 下面的代码产生同样的错误(点击按钮两次):-

import wx
import wx.grid as gridlib
app = wx.App()

def highlightrows(event):
   for row in range(0, myGrid.GetNumberRows(), 2):
      if row < myGrid.GetNumberRows():
         myGrid.SetRowAttr(row, attr)
   myGrid.ForceRefresh()
   myGrid.Refresh()

frame = wx.Frame(None, title="Highlight woes")
panel = wx.Panel(frame)
myGrid = gridlib.Grid(panel)
myGrid.CreateGrid(12, 8)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(myGrid, 1, wx.EXPAND)
panel.SetSizer(sizer)

btn = wx.Button(panel,  -1, 'Highlight rows')
sizer.Add(btn)
btn.Bind(wx.EVT_BUTTON, highlightrows)

attr = wx.grid.GridCellAttr()
attr.SetBackgroundColour('#eeeeee')

frame.Show()
app.MainLoop()

【问题讨论】:

    标签: grid attributes wxpython attr


    【解决方案1】:

    在您的示例中,您的 GridCellAttr 实例已超出范围并在您第二次按下按钮时被删除。老实说,我很惊讶它第一次起作用。当我单击该按钮两次时,出现以下错误:

    TypeError: in method 'Grid_SetRowAttr', expected argument 3 of type 'wxGridCellAttr *'
    

    再深入一点,如果你看一下第三个参数,你会发现它是这样的:

    <wx.grid.GridCellAttr; proxy of wxPython wrapper for DELETED GridCellAttr object! (The C++ object no longer exists.) >
    

    无论如何,这里有一种简单的方法,每次都对我有用:

    import wx
    import wx.grid as gridlib
    
    ########################################################################
    class MyForm(wx.Frame):
        """"""
    
        #----------------------------------------------------------------------
        def __init__(self):
            """Constructor"""
            wx.Frame.__init__(self, parent=None, title="A Simple Grid")
            panel = wx.Panel(self)
    
            self.myGrid = gridlib.Grid(panel)
            self.myGrid.CreateGrid(12, 8)
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.myGrid, 1, wx.EXPAND)
    
            btn = wx.Button(panel, label='Highlight rows')
            sizer.Add(btn)
            btn.Bind(wx.EVT_BUTTON, self.highlightrows)
    
            panel.SetSizer(sizer)
    
        #----------------------------------------------------------------------
        def highlightrows(self, event):
            """"""
            attr = wx.grid.GridCellAttr()
            attr.SetBackgroundColour('#eeeeee')
            for row in range(0, self.myGrid.GetNumberRows(), 2):
                if row < self.myGrid.GetNumberRows():
                    self.myGrid.SetRowAttr(row, attr)
            self.myGrid.ForceRefresh()
            self.myGrid.Refresh()
    
    if __name__ == "__main__":
        app = wx.App(False)
        frame = MyForm().Show()
        app.MainLoop()
    

    【讨论】:

    • 所以,(请原谅我缺少正确的术语)attr 应该更多地以局部变量的方式使用,而不是(正如我尝试的那样)全局变量。
    • 我在我的应用程序中尝试了这个,但是当我从(突出显示的)网格中删除行时出现另一个错误。在塔斯马尼亚已经很晚了,但我明天会仔细看看。
    • 这只是一个例子。从技术上讲,如果将attr 重命名为'self.attr,则可以将attr 放入__init__。
    • 我尝试运行 Mike 发布的代码(上图),但在第二次按下按钮时它给出了相同的错误。我现在想知道是否应该完全破坏网格,然后在数据更改时从头开始重建它。
    • 这适用于带有 wxPython 2.8.12.1 的 Xubuntu 14.04。你可以摧毁它,但这似乎太过分了,我认识其他不需要这样做的人。人们一直使用虚拟网格来存储数据库内容。或者,您可以使用 ObjectListView。我在数据库中使用了很多,效果很好!
    【解决方案2】:

    有点晚了,试试这个。我遇到了同样的问题...

    myGrid.SetRowAttr(row, attr.Clone())
    

    【讨论】:

    • 谢谢,看起来很有希望。它适用于上面的示例代码,但不适用于我的项目代码。我得调查一下。
    【解决方案3】:

    奇怪 - 与在 wxPython 2.8 中运行良好的代码类似的问题。升级到 3.0 后,我必须 Clone() 每一行的属性,否则我会收到上面的类型错误:

    TypeError: in method 'Grid_SetRowAttr', expected argument 3 of type 'wxGridCellAttr *'
    

    感谢 Jim 和 Lawrie 的建议。这可能是一个错误吗?这是我的代码:

    def initialPaint(self):
        wx.lib.colourdb.updateColourDB()
        self.oddLineColour = wx.NamedColour('GAINSBORO')
        oddlineattr = wx.grid.GridCellAttr()
        oddlineattr.SetBackgroundColour(self.oddLineColour)
    
        for (j, header) in enumerate(self.columnList):
            self.SetColLabelValue(j, header)
            for (i, bond) in enumerate(self.bondList):
                if bond in self.bdm.df.index:
                    if i % 2:
                        self.SetRowAttr(i,oddlineattr.Clone())#NOT NEEDED IN 2.8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      相关资源
      最近更新 更多