You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python登录验证中If与Else语句同时执行的问题求助

登录验证程序逻辑问题修复

问题现象

  • 输入正确的用户名和密码时,会同时输出「Correct」和「Wrong」
  • 输入错误的用户名或密码时,会连续输出两次「Wrong」

问题原因

代码中通过for login_detail in login_details遍历字典的所有用户名,每遍历一个用户就执行一次判断逻辑。由于字典里包含两个用户(John和Jane),循环会执行两次:

  • 验证通过时,第一次匹配到目标用户会打印「Correct」,第二次遍历另一个不匹配的用户时会打印「Wrong」
  • 验证失败时,两次遍历都无法匹配,因此打印两次「Wrong」

修复方案

方案一:直接利用字典查询(推荐)

不需要循环遍历,直接通过字典的键查询特性验证,逻辑更简洁高效:

from tkinter import *

root = Tk()
root.title("Login")
root.resizable(False, False)
root.geometry("500x200")

image1 = PhotoImage(file="C:/Users/Cesar Alkaisy/Pictures/icon.png")
root.iconphoto(True, image1)

username_label = Label(root, text="Username", font=("Arial", 15, "bold"))
username_label.grid(column=1, row=0, padx=20, pady=20)
username_entry = Entry(root)
username_entry.grid(column=2, row=0)

password_label = Label(root, text="Password", font=("Arial", 15, "bold"))
password_label.grid(column=1, row=1)
password_entry = Entry(root)
password_entry.grid(column=2, row=1)

login_details = {"John": "123", "Jane": "321"}


def submit():
    username = username_entry.get()
    password = password_entry.get()
    # 直接检查用户名是否存在且密码匹配
    if username in login_details and login_details[username] == password:
        print("Correct")
    else:
        print("Wrong")
    username_entry.delete(0, END)
    password_entry.delete(0, END)


submit_button = Button(root, text="Submit", command=submit)
submit_button.grid(column=2, row=2, pady=10)

root.mainloop()

方案二:使用标记变量控制循环

如果后续需要扩展更复杂的验证逻辑,可以通过标记变量记录验证状态,找到匹配项后立即终止循环:

from tkinter import *

root = Tk()
root.title("Login")
root.resizable(False, False)
root.geometry("500x200")

image1 = PhotoImage(file="C:/Users/Cesar Alkaisy/Pictures/icon.png")
root.iconphoto(True, image1)

username_label = Label(root, text="Username", font=("Arial", 15, "bold"))
username_label.grid(column=1, row=0, padx=20, pady=20)
username_entry = Entry(root)
username_entry.grid(column=2, row=0)

password_label = Label(root, text="Password", font=("Arial", 15, "bold"))
password_label.grid(column=1, row=1)
password_entry = Entry(root)
password_entry.grid(column=2, row=1)

login_details = {"John": "123", "Jane": "321"}


def submit():
    username = username_entry.get()
    password = password_entry.get()
    is_valid = False
    # 遍历键值对,找到匹配项后标记并终止循环
    for user, pwd in login_details.items():
        if user == username and pwd == password:
            is_valid = True
            break
    print("Correct" if is_valid else "Wrong")
    username_entry.delete(0, END)
    password_entry.delete(0, END)


submit_button = Button(root, text="Submit", command=submit)
submit_button.grid(column=2, row=2, pady=10)

root.mainloop()

改动说明

  • 方案一:通过username in login_details直接判断用户名是否存在,避免不必要的循环,代码更简洁,执行效率更高
  • 方案二:用is_valid变量记录验证结果,匹配成功后通过break终止循环,最后统一输出结果,避免重复打印

内容的提问来源于stack exchange,提问作者CesarKaiser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:15:39