如何使用Tkinter为我的应用程序解决python中的此类型错误?
每当我使用该程序尝试登录时,我都会收到此错误:如何使用Tkinter为我的应用程序解决python中的此类型错误?,python,user-interface,tkinter,types,self-reference,Python,User Interface,Tkinter,Types,Self Reference,每当我使用该程序尝试登录时,我都会收到此错误: Exception in Tkinter callback Traceback (most recent call last): File "C:\Program Files (x86)\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__ return self.func(*args) TypeError: LoginCheck() missing 1 required po
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Program Files (x86)\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__
return self.func(*args)
TypeError: LoginCheck() missing 1 required positional argument: 'self'
下面是我的一段代码,很抱歉太长了,但我不知道要想轻松解决这个问题,我到底需要展示多少
class Log(tkinter.Frame):
def __init__(self, parent, controller):
tkinter.Frame.__init__(self, parent)
self.userEnt = tkinter.Entry(self, width=50, justify="center", foreground="#000000", background="#FFFFFF")
self.userEnt.insert(0, "USERNAME")
self.userEnt.place(relx=0.26, rely=0.346)
self.passEnt = tkinter.Entry(self, width=50, show="*", justify="center", foreground="#000000", background="#FFFFFF")
# passEnt.background = "#FFFFFF"
self.passEnt.insert(0, "PASSWORD")
self.passEnt.place(relx=0.26, rely=0.413)
self.logBtn = tkinter.Button(self, text="login", bg="#383A39", fg="#AB97BD", width=15, height=3,
command=Log.LoginCheck)
self.logBtn.place(relx=0.70, rely=0.346)
self.createUserBtn = tkinter.Button(self, text="New User", bg="#383A39", fg="#AB97BD", width=15, height=2,
command=lambda: controller.show_frame(NewUser))
self.createUserBtn.place(relx=0.835, rely=0.925)
def LoginCheck(self):
global press
if press >= 1:
c.execute("SELECT * FROM Users")
list_of_users = (c.fetchall())
# print(list_of_users) Uncomment to print everything in the user table as a list
position = 0
for _ in list_of_users:
user = list_of_users[position]
if self.userEnt.get() == user[3] and self.passEnt.get() == user[4]:
print("Welcome,", user[1])
print("ID:", user[0])
print("First Name:", user[1])
print("Last Name:", user[2])
print("User Name:", user[3])
print("Password:", user[4])
app.mainloop()
elif self.userEnt.get() != user[3] and self.passEnt.get() != user[4]:
self.userEnt.delete(0, "END")
self.userEnt.insert(0, "The details entered are the wrong username and password")
elif self.userEnt.get() != user[3] and self.passEnt.get() == user[4]:
print("Incorrect username")
print(user)
print(press - 1)
self.userEnt.delete(0, "END")
self.userEnt.insert(0, "Enter the correct username please. " + str(press - 1) + "/" + str(
5) + " tries left")
press -= 1
elif self.userEnt.get() == user[3] and self.passEnt.get() != user[4]:
print("Incorrect password")
print(user)
print(press - 1)
self.userEnt.delete(0, "END")
self.userEnt.insert(0, "Enter the correct password please. " + str(press - 1) + "/" + str(
5) + " tries left")
press -= 1
else:
position += 1
# The commented code below was the fixed way of logging in via "username" and "password"
'''
if userEnt.get() == "username" and passEnt.get() == password:
menuWindow()
else:
print("Incorrect username/password")
print(press+1) # One is added for readability and easier understanding for debugging
userEnt.delete(0, END)
userEnt.insert(0, "Enter the correct details please. " + str(press+1) + "/" + str(5) + " tries left")
press += 1
'''
if press == 1:
self.userEnt.delete(0, "END")
self.userEnt.insert(0, "One attempt left. A 20 second ban is imminent.")
if press == 0:
self.userEnt.state = "readonly"
self.passEnt.state = "readonly"
time.sleep(20)
press = 5
self.userEnt.state = "ENABLED"
self.passEnt.state = "ENABLED"
self.userEnt.delete(0, "END")
self.userEnt.insert(0, "Username")
感谢您花时间阅读本文,请竖起大拇指回应
另外,谈到python,我是一个新手,我一直在使用教程,但我在一定程度上理解大多数东西是如何工作的。这里:
self.logBtn = tkinter.Button(
self, text="login", bg="#383A39",
fg="#AB97BD", width=15, height=3,
command=Log.LoginCheck
)
您正在传递一个未绑定的方法。未绑定的方法需要以第一个参数的形式显式地传递给当前实例(因为它们不能在实例上调用,所以不能在调用时将当前实例作为第一个参数注入)
显然,您希望通过的是self.LoginCheck
绑定方法。此处:
self.logBtn = tkinter.Button(
self, text="login", bg="#383A39",
fg="#AB97BD", width=15, height=3,
command=Log.LoginCheck
)
您正在传递一个未绑定的方法。未绑定的方法需要以第一个参数的形式显式地传递给当前实例(因为它们不能在实例上调用,所以不能在调用时将当前实例作为第一个参数注入)
显然,您希望通过的是
self.LoginCheck
bound方法。请阅读并按照这里的说明操作:如何创建一个错误在这行self.logBtn=tkinter.Button(self,text=“login”,bg=“#383A39”,fg=“#AB97BD”,width=15,height=3,command=Log.LoginCheck)
它应该是Log.LoginCheck()
@Somar:不,这不是命令应该是的。Log.LoginCheck
是一个function@Somar不,这是一个未绑定的方法,但无论如何这不是重点-tkinter.Button的命令的参数需要一个可调用的,所以传递给它一个函数就可以了(Python函数是您知道的对象?)。这里的问题是传递一个未绑定的方法,当正确调用该方法时,它会抱怨没有得到它的第一个位置参数。请阅读并按照这里的说明进行操作:如何创建错误在这一行self.logBtn=tkinter.Button(self,text=“login”,bg=“#383A39”,fg=“#AB97BD”,宽度=15,高度=3,命令=Log.LoginCheck)
它应该是Log.LoginCheck()
@Somar:不,这不是命令应该是的。Log.LoginCheck
是一个function@Somar不,这是一个未绑定的方法,但这并不是重点-tkinter.Button的命令的参数需要一个可调用的,所以传递一个函数就可以了(Python函数是你知道的对象?)。这里的问题是传递一个未绑定的方法,当正确调用该方法时,它会抱怨没有得到它的第一个位置参数。感谢您的帮助;似乎我必须研究未绑定、绑定和方法/函数。正如您在我的部分代码中所看到的,您认为我通常可以做些什么改进吗?如果可以,请继续好的。再次感谢。确实有改进的余地,但这也是正确的地方——你可能想在codereview上发表文章(一旦你的代码正常工作就可以了)。但是你至少应该“按”您的对象的一个属性而不是全局-OO的一部分要点是避免全局。感谢您的帮助;似乎我必须研究未绑定、绑定和方法/函数。正如您在我的部分代码中所看到的,您认为我总体上可以做些什么改进吗?如果可以,请告诉我。再次感谢。确实还有空间为了改进,但这也是正确的地方-你可能想在codereview上发布(一旦你的代码正常工作就可以了)。但是你至少应该让“press”成为你的对象的一个属性,而不是一个全局属性-OO的一部分要点是避免全局属性。