尝试从wxpython中的按钮调用函数时出错

时间:2015-07-17 13:01:07

标签: python wxpython

作为wxpthon的初学者,我正在创建一个简单的登录脚本,创建两个按钮:一个用于打开用户创建帐户的窗口,另一个用于注册帐户。我的相关代码是:

 yesbutton = wx.Button(panel, label="Yes,  I wish to log in", pos=(50,150), size=(150,60))
    self.Bind(wx.EVT_BUTTON, Login.login(Login), yesbutton)


 nobutton = wx.Button(panel, label="No,  I wish to register", pos=(270,150), size=(150,60))
    self.Bind(wx.EVT_BUTTON, Register.register(Register), nobutton)


class Login:


    def login(self):
        print("login")


class Register:

    def register(self):
        print("register")

然而,当我运行此代码时,我得到:

  

TypeError:必须使用Login实例调用unbound方法login()   作为第一个参数(改为获得classobj实例)

我对这个答案看了很多,但我无法解决任何问题。提前谢谢。

3 个答案:

答案 0 :(得分:3)

您的函数Login.login()Register.register()不会引用任何参数,但您已将LoginRegister类传递给它们。你的第二行应该是:

self.Bind(wx.EVT_BUTTON, Login.login, yesbutton)

在这种情况下,您不需要Login.login之后的括号,因为它在Bind函数中。同样调整你的其他绑定。

编辑:在调用这些类中的任何内容之前,还需要实例化Login对象和Register对象。不幸的是,我目前无法访问wxPython并且无法对其进行测试,但请尝试以下方法:

编辑2:这也会将事件传递给函数,因此请确保您调用的函数对此进行说明。

yesbutton = wx.Button(panel, label="Yes,  I wish to log in", pos=(50,150), size=(150,60))
log = Login()
self.Bind(wx.EVT_BUTTON, log.login, yesbutton)


nobutton = wx.Button(panel, label="No,  I wish to register", pos=(270,150), size=(150,60))
reg = Register()
self.Bind(wx.EVT_BUTTON, reg.register, nobutton)


class Login:

    def login(self, evt):
        print("login")

class Register:

    def register(self, evt):
        print("register")

答案 1 :(得分:0)

您是否尝试过使用lambda函数?

例如:self.Bind(wx.EVT_BUTTON, lambda: <INSTANCE OF LOGIN>.login(), yesbutton)

你会对rthe register命令

做同样的事情

答案 2 :(得分:0)

使用bind函数时,传递函数的第二个参数称为&#34; handler&#34;。默认情况下,传递给此函数的唯一内容是wx事件。执行此操作(使用您的代码)的正确语法是

self.Bind(wx.EVT_BUTTON, Login.login, yesbutton)

为了将来参考,如果要调用不将事件作为事件参数的函数,请执行以下操作:

self.Bind(wx.EVT_BUTTON, lambda event: Login.login(), yesbutton)