我在网格中突出显示其他行时遇到了问题。创建网格并用数据填充后,突出显示可选行的工作方式与预期一致。但是当加载新数据时,我会删除所有行,然后根据需要添加新行,这次网格突出显示会引发异常unhandled。这把我难倒了--有什么建议吗?下面的代码产生相同的错误(单击按钮两次):-
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()发布于 2015-06-15 21:25:25
在您的示例中,您的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()发布于 2015-12-29 23:25:02
奇怪-在wxPython 2.8中运行良好的代码也存在类似的问题。在升级到3.0时,我必须克隆()每一行的属性,否则我会得到上面的类型错误:
TypeError: in method 'Grid_SetRowAttr', expected argument 3 of type 'wxGridCellAttr *'感谢Jim和Lawrie的建议。这会不会是个bug?下面是我的代码:
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发布于 2015-12-06 05:48:35
有点晚了,但是,试试这个。我也有同样的问题。
myGrid.SetRowAttr(row, attr.Clone())https://stackoverflow.com/questions/30819441
复制相似问题