【问题标题】:How do I make the messagebox appear after the conditions are met?满足条件后如何让消息框出现?
【发布时间】:2022-01-02 22:06:06
【问题描述】:

我正在尝试通过 Tkinter 创建登录屏幕,并且我希望消息框在用户输入正确的用户名和密码或未正确输入时显示消息。 当我运行程序并输入用户名和密码时,没有出现消息框。有没有办法解决这个问题?

from tkinter import *
from tkinter import messagebox

root = Tk()
root.geometry("300x270")
root.title("staff login")
root.resizable(False, False)
root.configure(background ="black")

label = Label(root, text = "staff log-in") 
frame_heading = Frame(root)
frame_heading.grid(row=0, column=0, columnspan=2, padx=25,pady=10)

frame_entry = Frame(root) 
frame_entry.grid(row=1, column=0, columnspan=2, padx=25, pady=10)

Label(frame_heading,text ="Staff log-in",
font =('Arial',16))\
                  .grid(row=0, column=0, padx=0, pady=5)

Label(frame_entry, text = "Username: ")\
                .grid(row=2, column=0, padx=10, pady=5)
label(frame_entry, text = "Password: ")\
                .grid(row=3, column=0, padx=10, pady=5)
    
def login():
    label.config (text = "log in")
    username = Entry(frame_entry, width = 15, bg = "white")
    username.grid(row=2, column=1, padx=5,pady=5)

    password = Entry(frame_entry, width = 15, bg = "white")
    password.grid(row=3, column=1, padx=5,pady=5)

loginbutton = Button(root, text="Login",width=7,
                     command=login)
loginbutton.grid(row=2, column=0, padx=0, pady=5)

def loginbutton():
    username = username_entry.get()
    password = password_entry.get()
    if (username == 'admin' and password == 'abcd1234'):
        messagebox.showinfo('info', 'Correct Login')
    else:
        messagebox.showinfo('info', 'Invalid Login')

root.mainloop()

【问题讨论】:

  • 代码的哪一部分调用loginbutton?它永远不会被调用。也不要将变量命名为与函数相同的名称,它是 Label 而不是 label(在您的其中一行上)。
  • 我猜你来自不同的语言。在 python 中,你不需要 if 周围的括号。
  • 你有一个函数和一个名为loginbutton的变量,你永远不会调用消息框代码所在的函数。

标签: python tkinter tkmessagebox


【解决方案1】:

您的代码没有运行,所以我不得不更改一些内容。您还拥有它,因此您必须按下登录按钮才能显示用户名和密码框。这就是我所拥有的,我相信你正在努力实现的目标。

from tkinter import *
from tkinter import messagebox

root = Tk()
root.geometry("300x270")
root.title("staff login")
root.resizable(False, False)
root.configure(background="black")

label = Label(root, text="staff log-in")
frame_heading = Frame(root)
frame_heading.grid(row=0, column=0, columnspan=2, padx=25, pady=10)

frame_entry = Frame(root)
frame_entry.grid(row=1, column=0, columnspan=2, padx=25, pady=10)

Label(frame_heading, text="Staff log-in",
      font=('Arial', 16)).grid(row=0, column=0, padx=0, pady=5)

Label(frame_entry, text="Username: ").grid(row=2, column=0, padx=10, pady=5)
Label(frame_entry, text="Password: ").grid(row=3, column=0, padx=10, pady=5)


# def login(): -- I commented this line because the username and password entries should automatically populate
            #  -- The way you were doing it before these did not populate until after you pressed login
label.config(text="log in")
username = Entry(frame_entry, width=15, bg="white")
username.grid(row=2, column=1, padx=5, pady=5)

password = Entry(frame_entry, width=15, bg="white")
password.grid(row=3, column=1, padx=5, pady=5)

# Added the lambda command to the login function you wrote, which was never called anywhere else in the script.
loginbutton = Button(root, text="Login", width=7, command=lambda : loginbutton(username, password))
loginbutton.grid(row=2, column=0, padx=0, pady=5)


def loginbutton(username_entry, password_entry):
    username = username_entry.get()
    password = password_entry.get()
    if (username == 'admin' and password == 'abcd1234'):
        messagebox.showinfo('info', 'Correct Login')
    else:
        messagebox.showinfo('info', 'Invalid Login')


root.mainloop()

【讨论】:

    【解决方案2】:

    问题

    您的代码中存在多个问题,主要围绕提供错误的变量名称。一些主要问题是:

    • 在 loginbutton 中,您尝试访问 username_entrypassword_entry 变量,但在构建您所做的小部件时 username = Entry(...)password = Entry(...)
    • 单击“登录”按钮时将调用的command 定义为login,这与创建用户名和密码条目以及登录按钮的函数相同

    解决方案

    我相信你想要这样的东西:

    from tkinter import *
    from tkinter import messagebox
    
    def checkLogin():
        username = username_entry.get()
        password = password_entry.get()
        if (username == 'admin' and password == 'abcd1234'):
            messagebox.showinfo('info', 'Correct Login')
        else:
            messagebox.showinfo('info', 'Invalid Login')
    
    root = Tk()
    root.geometry("300x270")
    root.title("staff login")
    root.resizable(False, False)
    root.configure(background ="black")
    
    label = Label(root, text = "staff log-in") 
    frame_heading = Frame(root)
    frame_heading.grid(row=0, column=0, columnspan=2, padx=25,pady=10)
    
    frame_entry = Frame(root) 
    frame_entry.grid(row=1, column=0, columnspan=2, padx=25, pady=10)
    
    Label(frame_heading,text ="Staff log-in",
    font =('Arial',16))\
                      .grid(row=0, column=0, padx=0, pady=5)
    
    Label(frame_entry, text = "Username: ")\
                    .grid(row=2, column=0, padx=10, pady=5)
    Label(frame_entry, text = "Password: ")\
                    .grid(row=3, column=0, padx=10, pady=5)
    
    label.config (text = "log in")
    username_entry = Entry(frame_entry, width = 15, bg = "white")
    username_entry.grid(row=2, column=1, padx=5,pady=5)
    
    password_entry = Entry(frame_entry, width = 15, bg = "white")
    password_entry.grid(row=3, column=1, padx=5,pady=5)
    
    loginbutton = Button(root, text="Login",width=7,
                         command=checkLogin)
    loginbutton.grid(row=2, column=0, padx=0, pady=5)
    
    root.mainloop()
    

    重点是在创建登录按钮时,指定commandcheckLogin,这是您在用户单击登录按钮后执行任何检查的函数。

    【讨论】:

    • 你确实是对的。忘记了小部件的变量是在全局范围内定义的。编辑答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2021-09-06
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多