Tkinter登录按钮无响应,需实现验证后跳转至Vote_Page
Tkinter登录功能修复及Vote页面实现
问题背景
现有Tkinter+SQLite的注册登录程序,已实现“Login here”文本点击跳转登录页,但输入正确用户名密码后点击Login按钮无响应。需要完成:
- 修复登录按钮无反应问题
- 登录验证通过后跳转至Vote_Page,该页面需提供查找用户、修改密码、删除账号操作选项
问题排查
- 登录页的
Entry组件未指定父窗口new_win,导致无法正确获取输入内容 - 登录验证逻辑仅简单对比返回值,需确保
KullaniciAra函数返回对应用户的密码(用户不存在则返回None)
修复后完整代码
from tkinter import * from database import * def Control_(): var1 = NameE.get() var2 = LastnameE.get() var3 = UsernameE.get() var4 = PasswordE.get() search = KullaniciAra(var3) if search is None: kullanici_ekle(var1, var2, var3, var4) Login_Page() else: # 避免重复创建标签,先销毁已有错误标签 for widget in win.grid_slaves(row=8, column=1): widget.destroy() ErrorLabel = Label(win, text="This username is taken.") ErrorLabel.grid(row=8, column=1) def Vote_Page(current_user): def find_user(): # 查找用户功能实现示例 target_user = user_search_entry.get() result = KullaniciAra(target_user) if result: result_label.config(text=f"用户 {target_user} 存在") else: result_label.config(text=f"用户 {target_user} 不存在") def change_password(): # 修改密码功能实现示例 new_pwd = new_pwd_entry.get() if new_pwd: # 假设database.py中有修改密码的函数 sifre_guncelle(current_user, new_pwd) result_label.config(text="密码修改成功") else: result_label.config(text="请输入新密码") def delete_account(): # 删除账号功能实现示例 # 假设database.py中有删除用户的函数 kullanici_sil(current_user) vote_win.destroy() Login_Page() vote_win = Tk() vote_win.title("Vote Page") vote_win.geometry("300x250") # 查找用户模块 user_search_label = Label(vote_win, text="查找用户名:") user_search_label.grid(row=0, column=0, padx=5, pady=10) user_search_entry = Entry(vote_win) user_search_entry.grid(row=0, column=1, padx=5, pady=10) search_btn = Button(vote_win, text="查找", command=find_user) search_btn.grid(row=0, column=2, padx=5, pady=10) # 修改密码模块 new_pwd_label = Label(vote_win, text="新密码:") new_pwd_label.grid(row=1, column=0, padx=5, pady=10) new_pwd_entry = Entry(vote_win, show="*") new_pwd_entry.grid(row=1, column=1, padx=5, pady=10) change_pwd_btn = Button(vote_win, text="修改密码", command=change_password) change_pwd_btn.grid(row=1, column=2, padx=5, pady=10) # 删除账号按钮 delete_btn = Button(vote_win, text="删除账号", fg="red", command=delete_account) delete_btn.grid(row=2, column=1, pady=15) # 结果提示标签 result_label = Label(vote_win, text="", fg="green") result_label.grid(row=3, column=0, columnspan=3) vote_win.mainloop() def Login_Page(): def on_login(): username = UsernameE2.get() password = PasswordE2.get() # 假设KullaniciAra返回对应用户的密码,不存在则返回None stored_pwd = KullaniciAra(username) if stored_pwd == password and stored_pwd is not None: new_win.destroy() Vote_Page(username) else: # 显示登录错误提示 error_label.config(text="用户名或密码错误") # 销毁原注册窗口 win.destroy() new_win = Tk() new_win.title("T Messenger L") new_win.geometry("200x220") UsernameL2 = Label(new_win, text="Username", fg="black", bg="lightgray") UsernameL2.grid(row=0, column=0, padx=5, pady=5) # 绑定Entry到new_win窗口 UsernameE2 = Entry(new_win) UsernameE2.grid(row=0, column=1, padx=5, pady=5) PasswordL2 = Label(new_win, text="Password", fg="black", bg="lightgray") PasswordL2.grid(row=1, column=0, padx=5, pady=5) PasswordE2 = Entry(new_win, show="*") PasswordE2.grid(row=1, column=1, padx=5, pady=5) Button2 = Button(new_win, text="Login", command=on_login) Button2.grid(row=2, column=1, pady=10) # 登录错误提示标签 error_label = Label(new_win, text="", fg="red") error_label.grid(row=3, column=0, columnspan=2) new_win.mainloop() # 初始化数据库表 Tablo_olustur() # 注册窗口 win = Tk() win.title("T Messenger R") win.geometry("200x220") NameL = Label(win, text="Name", fg="black", bg="lightgray") NameL.grid(row=1, column=0, padx=5, pady=5) NameE = Entry(win) NameE.grid(row=1, column=1, padx=5, pady=5) LastnameL = Label(win, text="Lastname", fg="black", bg="lightgray") LastnameL.grid(row=2, column=0, padx=5, pady=5) LastnameE = Entry(win) LastnameE.grid(row=2, column=1, padx=5, pady=5) UsernameL = Label(win, text="Username", fg="black", bg="lightgray") UsernameL.grid(row=3, column=0, padx=5, pady=5) UsernameE = Entry(win) UsernameE.grid(row=3, column=1, padx=5, pady=5) PasswordL = Label(win, text="Password", fg="black", bg="lightgray") PasswordL.grid(row=4, column=0, padx=5, pady=5) PasswordE = Entry(win, show="*") PasswordE.grid(row=4, column=1, padx=5, pady=5) theLabel = Label(win, text="Login here", fg="blue", cursor="hand2", font=("TkDefaultFont",12,"underline")) theLabel.grid(row=5, column=1, pady=5) theLabel.bind("<Button-1>", lambda event: Login_Page()) Button1 = Button(win, text="Register", command=Control_) Button1.grid(row=6, column=1, pady=10) win.mainloop()
关键改动说明
- 修复登录输入获取问题:给登录页的
Entry组件指定父窗口new_win,确保能正确读取用户输入 - 完善登录验证逻辑:验证用户名对应的存储密码与输入密码是否匹配,同时排除用户不存在的情况
- 新增Vote_Page页面:实现查找用户、修改密码、删除账号的功能框架,需配合
database.py中对应的函数(如sifre_guncelle、kullanici_sil)完成数据库操作 - 优化提示逻辑:添加错误提示标签,避免重复创建标签导致的界面混乱
- 密码输入隐藏:给密码输入框添加
show="*"参数,提升安全性
内容的提问来源于stack exchange,提问作者xDevsMC
相关产品推荐
相关产品推荐

