【发布时间】:2014-11-21 00:34:23
【问题描述】:
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 解决方案对我不起作用,除非我做错了。
谢谢
【问题讨论】: