可以在Python中将wx.Panel定义为一个类吗?
我想定义几个插件。它们都是从一个叫做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 *'
提前谢谢你们!
3 个回答
我该如何定义一个类作为面板,然后在我的框架中调用这个类呢?
你尝试的方式差不多,但你没有正确调用父类的 __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: 在方法 'new_Panel' 中,期望参数 1 的类型是 'wxWindow *'
(编辑过) 其实你是在 __init__
方法里实例化了一个 wx.Panel(),而不是调用父类的 __init__
,正如 Javier(和 Bryan Oakley,纠正我)所指出的那样。(Javier 把 "parent" 参数改成了 "*args",让我有点困惑... 抱歉让你也困惑了。)
有一个叫做 wx.PyPanel
的类,它是一个面板的版本,专门用来在Python中进行子类化,也就是说你可以从这个类创建自己的新类,并且可以重写一些C++中的虚拟方法。
其实,还有很多其他的wx类也有类似的PyXxxx版本。
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能在使用一个叫做“库”的东西时,发现它的某些功能没有按预期工作。这就像你买了一台新手机,结果发现某个应用打不开一样。
在这种情况下,首先要检查的是你使用的版本。就像手机的系统更新一样,库也会定期更新,修复一些问题或者增加新功能。如果你的版本太旧,可能会导致一些错误。
另外,查看文档也是很重要的。文档就像是使用说明书,里面会告诉你这个库的功能、用法以及常见问题的解决办法。如果你没有仔细阅读,可能会错过一些重要的信息。
最后,如果你还是解决不了问题,可以考虑去一些论坛或者社区寻求帮助。在那里,你可以找到其他遇到相似问题的人,或者直接问问专家,他们可能会给你一些很好的建议。
class MyPanel(wx.Panel):
def __init__(self, *args):
wx.Panel.__init__(self, *args)
def draw(self):
# Your code here