程序运行时,Tkinter按钮激活 - Lambda无效

时间:2014-11-18 05:16:42

标签: python lambda tkinter

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解决方案对我不起作用,除非我做错了。

由于

1 个答案:

答案 0 :(得分:0)

要查找错误,我将lambda : testLogin(user)替换为lambda : print('foo')。命令仍然是铸造但没有印刷...... 在文件中搜索testLogin和eureka!您的绑定也需要一个lambda,例如,您在其中调用test。

此外,正确的行是:

root.bind('<Return>', lambda x : login.testLogin(usr1))

需要添加lambda参数,因为绑定的事件将作为参数传递。

享受Tk和ttk的乐趣;)

亚瑟。