from tkinter import *
from tkinter import ttk
from tkinter import messagebox
class LoginGUI:
def __init__(self, root):
self.root = root
self.root.title("Login")
self.mainframe = ttk.Frame(self.root, padding = "3 3 12 12")
self.mainframe.columnconfigure(0, weight=1)
self.mainframe.rowconfigure(0, weight=1)
self.mainframe.grid(sticky=("N, W, E, S"))
ttk.Label(self.mainframe, text = "Login", font = (20)).grid(column=1, row=1, sticky=(W, E))
ttk.Label(self.mainframe, text = "Username: ").grid(column=1, row=2, sticky=(W, E))
ttk.Label(self.mainframe, text = "Password: ").grid(column=1, row=3, sticky=(W, E))
self.user = StringVar()
self.password = StringVar()
self.user_entry = ttk.Entry(self.mainframe, width=10, textvariable = self.user)
self.user_entry.grid(column=2, row=2, sticky=(W, E))
self.password_entry = ttk.Entry(self.mainframe, show = "*", width=10, textvariable = self.password)
self.password_entry.grid(column=2, row=3, sticky=(W, E))
#ttk.Button(self.mainframe, text = "Login", command = testLogin()).grid(column=1, row=4, sticky=(W, E))
ttk.Button(self.mainframe, text = "Register").grid(column=2, row=4, sticky=(W, E))
self.valid = ""
ttk.Label(self.mainframe, textvariable = self.valid).grid(column=1, row=6, sticky=(W, E))
self.user_entry.focus()
def testLogin(self, usr):
if (self.user == usr.getUser()) and (self.password == usr.getPass()):
self.valid = "Correct!"
messagebox.showinfo("Login Confirmation", self.valid)
else:
self.valid = "Incorrect!"
messagebox.showinfo("Login Confirmation", self.valid)
class Credentials:
def __init__(self):
self.username = "User"
self.password = "Pass123"
def getUser(self):
return self.username
def getPass(self):
return self.password
def main():
root = Tk()
login = LoginGUI(root)
usr1 = Credentials()
ttk.Button(login.mainframe, text = "Login", command=lambda: login.testLogin(usr1)).grid(column=1, row=4, sticky=(W, E))
root.bind('<Return>', login.testLogin(usr1))
root.mainloop()
main()
我还在学习GUI编程,我把它作为一个测试,看看我是否可以创建一个登录屏幕以获得乐趣。我知道它非常粗糙,绝对需要工作。
我遇到的问题是,它会在程序运行时立即打开消息框,而不是在我单击“登录”按钮时打开消息框。为什么呢?
我见过类似问题的人遇到同样的问题,但对他们有用的Lambda解决方案对我不起作用,除非我做错了。
由于
答案 0 :(得分:0)
要查找错误,我将lambda : testLogin(user)
替换为lambda : print('foo')
。命令仍然是铸造但没有印刷......
在文件中搜索testLogin
和eureka!您的绑定也需要一个lambda,例如,您在其中调用test。
此外,正确的行是:
root.bind('<Return>', lambda x : login.testLogin(usr1))
需要添加lambda参数,因为绑定的事件将作为参数传递。
享受Tk和ttk的乐趣;)
亚瑟。