当我运行它时,两个按钮显示但是当我按下“登录”时,此错误显示:
inputDialog2 = LogIn(root)
TypeError: LogIn() takes no arguments (1 given)
如果按“注册”,则此错误显示:
self.Label1 = Label(top, text = "What is your username: ")
AttributeError: Label instance has no __call__ method
这是我的代码:
from Tkinter import *
# User Registers an account with a username password and passwor retype.
class Main:
def __init__(self, parent):
top = self.top = Toplevel(parent)
self.Label = Label(top, text = 'Choose an option')
self.Label.grid(row = 0)
self.LoginB = Button(top, text = 'Log In', command = LogIn)
self.LoginB.pack()
self.RegisterB = Button(top, text = 'Register', command = launch_register)
self.RegisterB.pack()
Main().pack()
class Register:
def __init__(self, parent):
top = self.top = Toplevel(parent)
self.VarEntUser = StringVar()
self.VarEntPass = StringVar()
self.VarEntRetype = StringVar()
self.Label1 = Label(top, text = "What is your username: ")
self.Label2 = Label(top, text = "Enter a password: ")
self.Label3 = Label(top, text = "Retype Password: ")
self.EntUser = Entry(top, textvariable = self.VarEntUser )
self.EntPass = Entry(top, textvariable = self.VarEntPass)
self.EntRetype = Entry(top, textvariable = self.VarEntRetype)
self.Label1.grid(row = 0, sticky = W)
self.Label2.grid(row = 1, sticky = W)
self.Label3.grid(row = 2, sticky = W)
self.EntUser.grid(row = 0, column = 1)
self.EntPass.grid(row = 1, column = 1)
self.EntRetype.grid(row = 2, column = 1)
self.MySubmitButton = Button(top, text = 'Submit', command=RegisterCheck)
self.MySubmitButton.pack()
self.U = raw_input(self.VarEntUser.get())
self.P = raw_input(self.VarEntPass.get())
self.R = raw_input(self.VarEntRetype.get())
class LogIn:
def __init__(self, parent):
top = self.top = Toplevel(parent)
VarUserLog = StringVar()
VarPassLog = StringVar()
self.LabelUser = Label(top, text = 'Username:')
self.EntUserLog = Label(top, text = 'Password: ')
self.EntUserLog = Entry(top, textvariable = self.VarUserLog)
self.EntPassLog = Entry(top, textvariable = self.VarPassLog)
self.UserLog.grid(row = 1)
self.PassLog.grid(row = 2)
self.EntUserLog.grid(row = 1, column = 1)
self.EntPassLog.grid(row = 2, column = 1)
# runs the 'LoginCheck' function
self.LogInButton = Button(top, text = "Log In", command = LogInCheck)
self.User = raw_input(self.EntUserLog.get())
self.Pass = raw_input(self.EntUserLog.get())
# Checks the Log In details
def LogInCheck():
if len(self.User) <= 0 and len(self.Pass) <= 0:
print "Please fill in all fields."
else:
pass
if self.User in 'username.txt' and self.Pass in 'password':
print 'You are now logged in!'
else:
print "Log in Failed"
# Checks the password and checks if all fields have been entered
def RegisterCheck(self):
if len(self.P) <= 0 and len(self.U) <= 0:
print "Please fill out all fields."
else:
pass
if self.P == self.R:
pass
else:
print "Passwords do not match"
with open('username.txt', 'a') as fout:
fout.write(self.U + '\n')
with open('password.txt', 'a') as fout:
fout.write(self.P + '\n')
def launch_register():
inputDialog = Register(root)
root.wait_window(inputDialog.top)
def LogIn():
inputDialog2 = LogIn(root)
root.wait_window(inputDialog2.top)
# Main Window--
root = Tk()
Label = Label(root, text = 'Choose an option')
Label.pack()
LoginB = Button(root, text = 'Log In', command = LogIn)
LoginB.pack()
RegisterB = Button(root, text = 'Register', command = launch_register)
RegisterB.pack()
root.mainloop()
答案 0 :(得分:2)
程序中导致这些错误的错误:
首先声明一个名为LogIn
的类;但是您稍后会创建一个具有相同名称的函数。由于后者会覆盖前者,因此调用方法而不是类构造函数。
同样,在行Label = Label(root, text = 'Choose an option')
中,您为名称Label
指定了新的含义,这样当您到达发生第二个错误的行时,名称{{1不再引用名为Label
的类,而是引用该类的实例。
基本上,您应该为变量,函数和类使用唯一的名称(包括从Tkinter等模块导入的名称)。