我正在尝试创建一个新的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的内部控件,因此我可能无法以这种方式使用它。但是,它肯定会很方便。
关于我做错的任何想法?
答案 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 ++级别集成。