是否可以在Python中将wx.Panel定义为类?

时间:2010-02-16 12:41:37

标签: python class wxpython panel frame

我想定义几个插件。 它们都继承自超类插件。

每个插件都包含一个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 *'

提前致谢!

3 个答案:

答案 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”让我感到困惑......抱歉让你迷惑。)