1

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

每个插件都包含在一个 wx.Panel 上,它有一个更具体的方法,称为“draw”。

如何将一个类定义为面板,然后在我的框架中调用该类?

我试过这样:

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 *'

提前致谢!

4

3 回答 3

5
class MyPanel(wx.Panel):
    def __init__(self, *args):
        wx.Panel.__init__(self, *args)

    def draw(self):
        # Your code here
于 2010-02-16T13:38:07.990 回答
2

有一个类wx.PyPanel是 Panel 的一个版本,旨在从 Python 子类化,并允许您覆盖 C++ 虚拟方法。

还有许多其他 wx 类的 PyXxxx 版本。

于 2010-02-16T13:26:00.743 回答
0

如何将一个类定义为面板,然后在我的框架中调用该类?

您尝试的很接近,但是您没有正确调用 super class __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 *'

(已编辑)正如哈维尔(和布莱恩奥克利,纠正我)指出的那样,您实际上是在内部实例化 wx.Panel()__init__而不是调用超类。__init__(Javier 将“父”arg 更改为“*args”让我感到困惑……抱歉让你感到困惑。)

于 2010-02-16T14:44:13.180 回答