WxPython: 派生wx.ListItem但wx.ListCtrl只返回旧类
我在使用派生类的时候遇到了一个小问题,具体来说是关于 wx.ListItem
和 wx.ListCtrl
的。我成功地把 wx.ListItem
派生成了一个 MediaItem
,虽然代码还没完成,但你大概明白我的意思:
class MediaItem(wx.ListItem):
def __init__ (self, fullname):
wx.ListItem.__init__(self)
self.fullname = fullname
self.filename = os.path.basename(fullname)
# snap...
def getFullname(self):
return self.fullname
wx.ListCtrl
很乐意接受这个,因为Python有个“鸭子类型”的哲学。不过现在的问题是,当我使用 wx.ListCtrl.GetItem(index)
这个方法时,它返回的是 ListItem
,而不是 MediaItem
。Python 报错说 wx.ListItem
没有 getFullname
这个属性。
把对象转换成其他类型似乎不是解决这个问题的正确方法。虽然这可能和问题无关,但我还是把出错的那行代码贴出来:
filename = self.filelist.GetItem(event.GetIndex()).getFullname()
这里的 self.filelist
是一个 wx.ListCtrl
。
1 个回答
2
我想我还是得忍耐一下,回到那种不太理想的手动记录方式。只要做得好,其实也没什么大不了的,但我对wxPython的期望更高。
根据我查找和收集的信息,问题出在wxPython的类结构上。要是这些类是用纯Python写的,或者我用C++来编写,那就能很好地工作了。但现在因为设计上的限制,对象的多态性出现了问题:原生的C++ wx类只会接收一个wx.ListItem
,而且它肯定只会返回一个wx.ListItem
给wxPython。
所以我现在的“解决办法”是直接从wx.ListCtrl
派生,而不是wx.ListItem
,这样可以存储需要的信息,并控制显示效果。