我想定义几个插件。 它们都继承自超类插件。
每个插件都包含一个wx.Panel,它有一个更具体的方法叫做“draw”。
如何将类定义为Panel,然后在我的框架中调用该类?
我试过这样:
class Panel(wx.Panel):
def __init__(self, parent):
wx.Panel(self, parent)
但它给了我这个错误:
in __init__
_windows_.Panel_swiginit(self,_windows_.new_Panel(*args, **kwargs))
TypeError: in method 'new_Panel', expected argument 1 of type 'wxWindow *'
提前致谢!
答案 0 :(得分:4)
class MyPanel(wx.Panel):
def __init__(self, *args):
wx.Panel.__init__(self, *args)
def draw(self):
# Your code here
答案 1 :(得分:2)
有一个类wx.PyPanel
,它是Panel的一个版本,旨在从Python继承,并允许您覆盖C ++虚拟方法。
还有许多其他wx类的PyXxxx版本。
答案 2 :(得分:0)
如何将类定义为Panel,然后在我的框架中调用该类?
您尝试的内容很接近,但您没有正确调用超类__init__
。但是,在子类化wxPython类时,通常最好使用以下模式,这样您就不必担心要传递给它的特定参数。 (这不会解决你的问题,这超出了相关代码的范围,但它可能会更清楚地发生了什么。)
class Panel(wx.Panel):
def __init__(self, *args, **kwargs):
wx.Panel.__init__(self, *args, **kwargs)
# ... code specific to your subclass goes here
这可确保传入的任何内容都传递给超类方法,而不会添加或删除。这意味着您的子类的签名与超类签名完全匹配,这也是使用您的子类的其他人可能期望的。
但是,如果您实际上没有在自己的__init__()
方法中执行任何操作而不是调用超类__init__()
,则根本不需要提供该方法!
至于你原来的问题:
但它给了我这个错误:
__init__ windows.Panel_swiginit(self,windows.new_Panel(*args, **kwargs)) TypeError: in method 'new_Panel', expected argument 1 of type 'wxWindow *'
(已编辑)您实际上是在__init__
内实例化wx.Panel()而不是调用超类__init__
,就像Javier(和Bryan Oakley,正在纠正我指出。 (哈维尔将“父母”arg改为“* args”让我感到困惑......抱歉让你迷惑。)