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

基于Tkinter和CustomTkinter的密码验证器登录异常求助

密码验证器访问被拒绝问题修复

问题根源

你的代码核心错误是提前获取了输入框内容:程序启动时就调用entry1.get()和entry2.get(),此时输入框为空,后续用户输入的内容根本没被读取到,验证时一直用初始空值,自然匹配不上预设账号密码。

另外还有两个小问题:

  • 原循环中每遍历一个不匹配账号就触发"Access Nope"提示,会导致多次语音播报
  • speak(x)中的x是元组,直接传入会报错,需要转为字符串

修复后的完整代码

import tkinter
import customtkinter
from PIL import ImageTk, Image
from pyttsx3 import *

customtkinter.set_appearance_mode("System") 
customtkinter.set_default_color_theme("blue") 

app = customtkinter.CTk() 
app.geometry("1920x1080")
app.attributes('-fullscreen', True)
app.title('Login')
USRd = {"Goop": "S311", "Drep": "S456"}

img1 = ImageTk.PhotoImage(Image.open("Wallpaper.png"))
l1 = customtkinter.CTkLabel(master=app, image=img1)
l1.pack()

frame = customtkinter.CTkFrame(master=l1, width=320, height=360, corner_radius=15)
frame.place(relx=0.5, rely=0.5, anchor=tkinter.CENTER)

l2 = customtkinter.CTkLabel(master=frame, text="Log into your Account", font=('Century Gothic', 20))
l2.place(x=50, y=45)

# 初始化输入框和变量,不再提前获取内容
user_var = customtkinter.StringVar(value='')
entry1 = customtkinter.CTkEntry(
    master=frame,
    width=220,
    placeholder_text='Username',
    textvariable=user_var,
)
entry1.place(x=50, y=110)

passw_var = customtkinter.StringVar(value='')
entry2 = customtkinter.CTkEntry(master=frame, width=220, placeholder_text='Password', textvariable=passw_var, show='*')
entry2.place(x=50, y=165)

def button_function():
    # 点击按钮时才实时获取输入内容
    user = entry1.get()
    passw = entry2.get()
    access_granted = False
    matched_k = ""
    matched_v = ""
    
    for k, v in USRd.items():
        if user == k and passw == v:
            access_granted = True
            matched_k = k
            matched_v = v
            break
    
    if access_granted:
        speak("Access Granted")
        x = f"Welcome back {matched_k}, You have {matched_v} Notifications"
        speak(x)
        app.destroy()
        w = customtkinter.CTk()
        w.geometry("1280x720")
        w.title('Welcome')
        l1 = customtkinter.CTkLabel(master=w, text=x, font=('Century Gothic', 60))
        l1.place(relx=0.5, rely=0.5, anchor=tkinter.CENTER)
        w.mainloop()
    else:
        speak("Access Denied")

button1 = customtkinter.CTkButton(master=frame, width=220, text="Login", command=button_function, corner_radius=6)
button1.place(x=50, y=240)

if __name__ == "__main__":
    app.mainloop()

关键修改点

  1. 移除初始化输入框后的get()调用,改为在button_function中点击按钮时实时读取输入内容
  2. 调整验证逻辑:遍历所有账号判断是否匹配,匹配成功后记录账号信息并跳出循环,最后统一处理通过/拒绝的情况,避免多次提示
  3. 将x改为格式化字符串,确保speak能正常读取;给密码输入框加上show='*'增强安全性
  4. 变量名调整为user_var、passw_var,避免和后续读取的输入内容变量混淆

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:25:32