【问题标题】:Is it possible to define a wx.Panel as a class in Python?是否可以将 wx.Panel 定义为 Python 中的类?
【发布时间】:2010-02-16 12:41:37
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • 我用错误的参数调用了小组,现在我做得很好:)

标签: python class wxpython panel frame


【解决方案1】:
class MyPanel(wx.Panel):
    def __init__(self, *args):
        wx.Panel.__init__(self, *args)

    def draw(self):
        # Your code here

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • @Dave Kirby,虽然你说的是真的,但它与 OP 的问题没有任何关系,也没有必要,除非你必须重写其中一种特殊方法,这是相当罕见的.
    【解决方案3】:

    如何将一个类定义为 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,纠正我)指出的那样. (Javier 将“父”arg 更改为“*args”让我感到困惑……抱歉让你感到困惑。)

    【讨论】:

    • @Peter:“正如您所发现的,该错误仅仅是因为您没有正确传递对父窗口的引用。” ——我认为这是不正确的。我认为问题在于他在构造函数中调用的是 wx.Panel() 而不是 wx.Panel.__init__()。
    • @Bryan,感谢您的更正!我修复了具有相同问题的剪切和粘贴代码,并指出了该问题。
    猜你喜欢
    • 1970-01-01
    • 2011-06-20
    • 2023-01-05
    • 1970-01-01
    • 2021-07-25
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多