首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxpython wxgrid属性

wxpython wxgrid属性
EN

Stack Overflow用户
提问于 2015-06-13 21:55:19
回答 3查看 697关注 0票数 0

我在网格中突出显示其他行时遇到了问题。创建网格并用数据填充后,突出显示可选行的工作方式与预期一致。但是当加载新数据时,我会删除所有行,然后根据需要添加新行,这次网格突出显示会引发异常unhandled。这把我难倒了--有什么建议吗?下面的代码产生相同的错误(单击按钮两次):-

代码语言:javascript
复制
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()
EN

回答 3

Stack Overflow用户

发布于 2015-06-15 21:25:25

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

代码语言:javascript
复制
TypeError: in method 'Grid_SetRowAttr', expected argument 3 of type 'wxGridCellAttr *'

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

代码语言:javascript
复制
<wx.grid.GridCellAttr; proxy of wxPython wrapper for DELETED GridCellAttr object! (The C++ object no longer exists.) >

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

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2015-12-29 23:25:02

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

代码语言:javascript
复制
TypeError: in method 'Grid_SetRowAttr', expected argument 3 of type 'wxGridCellAttr *'

感谢Jim和Lawrie的建议。这会不会是个bug?下面是我的代码:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2015-12-06 05:48:35

有点晚了,但是,试试这个。我也有同样的问题。

代码语言:javascript
复制
myGrid.SetRowAttr(row, attr.Clone())
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30819441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档