转载自
http://blog.donews.com/limodou/
今天在开发NewEdit功能时,我使用了一个 wxListCtrl,它要用到图形,我提供了一个有两个图形的ImageList,用它来显示不同的状态.基本代码如下:
imagel = wx.ImageList(16, 16)
self.uncheck_state = imagel.Add(wx.Image('images/uncheck.gif').ConvertToBitmap())
self.check_state = imagel.Add(wx.Image('images/check.gif').ConvertToBitmap())
box = wx.BoxSizer(wx.VERTICAL)
self.list = wx.ListCtrl(self, -1, style = wx.LC_REPORT | wx.SUNKEN_BORDER)
self.list.SetImageList(imagel, wx.IMAGE_LIST_SMALL)
插入行数据的部分省略了.我发现图形根本显示不出来.试来试去,我终于想起来了,以前也出现过这个问题,其原因就是因为这里的imagel(imagelist的对象)是一个局部对象,在真正显示图形时,这个对象已经被释放掉了.尽管SetImageList方法对它有一个引用,但从现象上看,它的确是被删除了,所以图形显示不出来.既然知道了问题的所在,解决就非常容易,将其保存为对象的属性即可(即不作为局部变量).改变后的代码为:
self.imagel = wx.ImageList(16, 16)
self.uncheck_state = self.imagel.Add(wx.Image('images/uncheck.gif').ConvertToBitmap())
self.check_state = self.imagel.Add(wx.Image('images/check.gif').ConvertToBitmap())
box = wx.BoxSizer(wx.VERTICAL)
self.list = wx.ListCtrl(self, -1, style = wx.LC_REPORT | wx.SUNKEN_BORDER)
self.list.SetImageList(self.imagel, wx.IMAGE_LIST_SMALL)
也就是在所有imagel前加上了self,就行了.