将Bind用于wx.Button时的Python TypeError

时间:2011-12-05 10:21:42

标签: python wxpython bind argument-passing typeerror

我有一个名为WxFrame的类,它创建了一个wxPython框架。我添加了一个名为createRunButton的方法,它接收self和pydepp,它是PyDEPP类的对象

import wx

class WxFrame(wx.Frame):
    def __init__(self, parent, title):
        super(WxFrame, self).__init__(parent, title=title)
        self.Maximize()
        self.Show()

    def createRunButton(self,pydepp):
        #pydepp.run()
        self.runButton = wx.Button(self, label="Run")
        self.Bind(wx.EVT_BUTTON, pydepp.run, self.runButton

这是PyDEPP类:

class PyDEPP:
    def run(self):
        print "running"

我实例化并运行它:

import wx
from gui.gui import WxFrame
from Depp.Depp import PyDEPP

class PyDEPPgui():
    """PyDEPPgui create doc string here ...."""
    def __init__(self,pydepp):
        self.app = wx.App(False)
         ##Create a wxframe and show it
        self.frame = WxFrame(None, "Cyclic Depp Data Collector - Ver. 0.1")
        self.frame.createRunButton(pydepp)
        self.frame.SetStatusText('wxPython GUI successfully initialised')

if __name__=='__main__':
    #Launch the program by calling the PyDEPPgui __init__ constructor
    pydepp = PyDEPP()
    pydeppgui = PyDEPPgui(pydepp)
    pydeppgui.app.MainLoop()

运行上述代码时出现的错误是: TypeError:run()只取1个参数(给定2个)

但是,如果我注释掉绑定并取消注释pydepp.run()行,那么它可以正常工作。

答案很明显我很确定,但我从未研究过CompSci或OO编码。

2 个答案:

答案 0 :(得分:2)

事件作为参数传递给回调函数。这应该有效:

class PyDEPP:
    def run(self, event):
        print "running"

答案 1 :(得分:1)

当触发事件时,会将两个参数传递给回调函数run():触发事件的对象和wxEvent对象。由于run只接受代码中的一个参数,因此解释器会给出该错误,该错误告诉您已经提供了太多参数。

替换

run(self):  # Expects one argument, but is passed two. TypeError thrown

run(self, event): # Expects two arguments, gets two arguments.  All is well

它应该有用。

这是一个错误告诉你很多关于代码有什么问题的实例。鉴于“run()只需要1个参数(给定2个)”,你会立即知道你不小心通过了额外的参数,或者运行应该期待另一个参数。