2010-02-25 47 views
0

我试图做一个新的wx.Choice-like控件(实际上是wx.Choice的一个替换),它使用wx.ItemContainer来管理项目列表。下面是一个小例子,示出了错误:我可以在派生类中使用wxPython 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,所以它可能是不可能的,我使用它这条路。但是,它肯定会很方便。

关于我在做什么错的任何想法?

回答

0

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

对于ItemContainer,似乎没有这样的包装 - 而且ItemContainer在多重继承模式中用作父项的事实可能会使问题变得更加复杂。

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

+0

感谢您的回答。我结束了这样的事情。 – oofoe 2010-04-28 14:46:47

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() 
+0

这是一个很酷的把戏。我会牢记这一点。我最终创造了自己的控制权(见上面的答案),但如果我看到了你的回答,我想我会有一个更容易的时间。谢谢回答! – oofoe 2010-04-28 14:48:43

相关问题