基于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()
关键修改点
- 移除初始化输入框后的
get()调用,改为在button_function中点击按钮时实时读取输入内容 - 调整验证逻辑:遍历所有账号判断是否匹配,匹配成功后记录账号信息并跳出循环,最后统一处理通过/拒绝的情况,避免多次提示
- 将
x改为格式化字符串,确保speak能正常读取;给密码输入框加上show='*'增强安全性 - 变量名调整为
user_var、passw_var,避免和后续读取的输入内容变量混淆
内容的提问来源于stack exchange,提问作者Venexs
相关产品推荐
相关产品推荐

