【问题标题】:Tkinter button activates when Program Runs - Lambda not working程序运行时 Tkinter 按钮激活 - Lambda 不工作
【发布时间】: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 解决方案对我不起作用,除非我做错了。

谢谢

【问题讨论】:

    标签: python lambda tkinter


    【解决方案1】:

    为了找出错误,我将lambda : testLogin(user) 替换为lambda : print('foo')。命令仍然施放,但没有打印... 在文件中搜索testLogin 和尤里卡!您的绑定也需要一个 lambda,例如,您在其中调用 test。

    另外,正确的行是:

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

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

    享受 Tk 和 ttk 的乐趣;)

    亚瑟。

    【讨论】:

    • 不要忘记将问题标记为已回答 ^^ 很高兴,我喜欢 Tkinter!
    猜你喜欢
    • 2011-04-11
    • 2015-03-24
    • 1970-01-01
    • 2014-01-10
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多