尝试从 wxpython 中的按钮调用函数时出错
Error when attempting to call function from button in wxpython
作为 wxpthon 的初学者,我正在创建一个简单的登录脚本,它创建了两个按钮:一个用于打开 window 供用户创建帐户,另一个用于注册帐户。我的相关代码是:
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: unbound method login() must be called with Login instance
as first argument (got classobj instance instead)
我找了很多这个答案,但我无法找到任何解决方案。提前致谢。
您是否尝试过使用 lambda 函数执行此操作?
例如:self.Bind(wx.EVT_BUTTON, lambda: <INSTANCE OF LOGIN>.login(), yesbutton)
您可以对注册命令做同样的事情
您的函数 Login.login()
和 Register.register()
没有参数,但是您将 Login
和 Register
类 传递给它们。你的第二行应该是:
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")
当您使用绑定函数时,您传递函数的第二个参数称为 "handler"。默认情况下,唯一传递给此函数的是 wx 事件。执行此操作(使用您的代码)的正确语法是
self.Bind(wx.EVT_BUTTON, Login.login, yesbutton)
为了将来参考,如果您想调用不将事件作为 Event 参数的函数,请执行以下操作:
self.Bind(wx.EVT_BUTTON, lambda event: Login.login(), yesbutton)
作为 wxpthon 的初学者,我正在创建一个简单的登录脚本,它创建了两个按钮:一个用于打开 window 供用户创建帐户,另一个用于注册帐户。我的相关代码是:
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: unbound method login() must be called with Login instance as first argument (got classobj instance instead)
我找了很多这个答案,但我无法找到任何解决方案。提前致谢。
您是否尝试过使用 lambda 函数执行此操作?
例如:self.Bind(wx.EVT_BUTTON, lambda: <INSTANCE OF LOGIN>.login(), yesbutton)
您可以对注册命令做同样的事情
您的函数 Login.login()
和 Register.register()
没有参数,但是您将 Login
和 Register
类 传递给它们。你的第二行应该是:
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")
当您使用绑定函数时,您传递函数的第二个参数称为 "handler"。默认情况下,唯一传递给此函数的是 wx 事件。执行此操作(使用您的代码)的正确语法是
self.Bind(wx.EVT_BUTTON, Login.login, yesbutton)
为了将来参考,如果您想调用不将事件作为 Event 参数的函数,请执行以下操作:
self.Bind(wx.EVT_BUTTON, lambda event: Login.login(), yesbutton)