我可以在派生类中使用wxPython wx.ItemContainer吗?

时间:2010-02-25 16:20:09

标签: python wxpython

我正在尝试创建一个新的wx.Choice-like控件(实际上是wx.Choice的替代品),它使用wx.ItemContainer来管理项目列表。以下是显示错误的最小示例:

import wx
class c(wx.ItemContainer):
    def __init__(my): pass

x = c()
x.Clear()

这失败了:

Traceback (most recent call last):
  File "", line 1, in 
  File "c:\python25\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 1178
7, in Clear
    return _core_.ItemContainer_Clear(*args, **kwargs)
TypeError: in method 'ItemContainer_Clear', expected argument 1 of type 'wxItemContainer *'

使用ItemContainer的其他控件似乎是wxWindows的内部控件,因此我可能无法以这种方式使用它。但是,它肯定会很方便。

关于我做错的任何想法?

2 个答案:

答案 0 :(得分:1)

wx.ItemContainer无法直接实例化,例如尝试

x = wx.ItemContainer()

它抛出错误

Traceback (most recent call last):
  File "C:\<string>", line 1, in <module>
  File "D:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 11812, in __init__
    def __init__(self): raise AttributeError, "No constructor defined"
AttributeError: No constructor defined

原因是它是一种接口(如果我们可以在python中调用它)并且你不能在它上面调用__init__,而是将它用作第二个基础并覆盖你使用的方法,例如。

class C(wx.PyControl, wx.ItemContainer): 
    def __init__(self, *args, **kwargs):
        wx.PyControl.__init__(self, *args, **kwargs)

    def Clear(self):
        pass

app = wx.PySimpleApp()

frame = wx.Frame(None,title="ItemContainer Test")
x = C(frame)
x.Clear()

frame.Show()
app.SetTopWindow(frame)
app.MainLoop()

答案 1 :(得分:0)

你的怀疑是在正确的轨道上。您不能将任何wxWidgets类型子类化,因为它们位于C ++域中,并且仅在名义上包含在Python中。相反,你需要一个Py *类,你可以将其子类化。 this Wiki entry on writing custom controls中给出了解释。

对于ItemContainer,似乎没有这样的包装器 - 而且ItemContainer在多重继承模式中用作父类的事实甚至可能使问题复杂化。

我怀疑在wxPython中,可能无法替换ItemContainer - 如果你确实需要它,它必须在C ++级别集成。