如何使用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的一部分要点是避免全局属性。