在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()必须与login实例一起调用作为第一个参数(得到了classobj实例)

我为这个答案找了很多,但我不能做出任何解决方案。

您的函数Login.login()Register.register()没有参数,但是您将LoginRegister类传递给它们。第二行应该改为:

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

在这种情况下,您不需要在Login.login之后加上括号,因为它在Bind函数内。类似地调整你的其他绑定。

Edit:您还需要在从这些类调用任何内容之前实例化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")

您是否尝试过使用lambda函数来执行此操作?

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

您可以对rregister命令

执行相同的操作。

使用bind函数时,传递函数的第二个参数称为"handler"。默认情况下,传递给这个函数的唯一东西是一个wx事件。正确的语法是

(使用您的代码)

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

作为将来的参考,如果你想在event上调用一个不以event作为参数的函数,可以这样做:

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

最新更新