WxPython: 派生wx.ListItem但wx.ListCtrl只返回旧类

3 投票
1 回答
609 浏览
提问于 2025-04-16 00:38

我在使用派生类的时候遇到了一个小问题,具体来说是关于 wx.ListItemwx.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,这样可以存储需要的信息,并控制显示效果。

撰写回答