Tkinter函数内变量与SQL查询结果匹配失败的问题求助
问题分析与修复方案
核心问题总结
你的代码主要存在变量作用域错误、SQL查询写法错误、Tkinter主循环逻辑错误这几个问题,导致无法正确获取用户输入并完成身份验证。
具体错误点与修复
1. Tkinter主循环与变量赋值顺序错误
loginpage函数中,root.mainloop()是阻塞式的,主循环结束后(窗口关闭)才会执行后面的Username = UserName.get(),这意味着永远拿不到用户在登录时输入的内容。同时,函数内的Username和Password是局部变量,不会修改全局的同名变量。
修复方式:
- 将输入框对象设为全局变量,让
submitlog可以直接访问; - 移除主循环后的无效赋值,通过按钮触发的函数实时获取输入值。
2. SQL查询的错误写法
- 混合使用字符串格式化和参数化查询,导致语法错误,还存在SQL注入风险;
- 直接对游标执行结果取
[0],如果没有匹配用户会抛出IndexError; - 遍历查询结果的方式错误,游标本身是可迭代对象,不需要额外索引。
修复方式:
- 使用SQLite的参数化查询(
?作为占位符),避免注入风险和语法错误; - 先获取查询结果,判断是否存在匹配用户后再进行密码对比。
3. logOut函数的方法调用错误
root.destroy是方法,需要加括号调用root.destroy(),否则不会执行窗口销毁操作。
修复后的完整代码
import sqlite3 import os from tkinter import * from tkinter import messagebox login = False root = Tk() connection1 = sqlite3.connect("Login.db") # 全局声明输入框对象,让submitlog可以访问 UserName = None PassWord = None def submitlog(): cursor1 = connection1.cursor() # 获取用户输入并去除前后空格 username = UserName.get().strip() password = PassWord.get().strip() # 参数化查询,避免SQL注入 cursor1.execute('SELECT Password FROM Login WHERE Username = ?', (username,)) result = cursor1.fetchone() # 获取单条匹配结果(用户名唯一) if result: db_password = result[0] if db_password == password: print(True) messagebox.showinfo("成功", "登录验证通过") else: print("密码不匹配") print(f"输入用户名: {username}") print(f"输入密码: {password}") print(f"数据库密码: {db_password}") messagebox.showerror("失败", "密码错误") else: print("未找到该用户名") messagebox.showerror("失败", "用户名不存在") def logOut(): root.destroy() # 修复方法调用 exit() def loginpage(): global UserName, PassWord # 声明使用全局变量 root.geometry("1000x700") root.resizable(False, False) root.configure(background="Black") frame_heading = Frame(root) frame_heading.grid(row=0, column=0, columnspan=2, padx=30, pady=5) frame_entry = Frame(root) frame_entry.grid(row=1, column=0, columnspan=2, padx=10, pady=10) Label(frame_heading, text="请登录", font=("Arial", 16)).grid(row=0, column=0, padx=0, pady=5) Label(frame_entry, text="用户名: ").grid(row=0, column=0, padx=10, pady=10) Label(frame_entry, text="密码: ").grid(row=1, column=0, padx=10, pady=10) # 初始化全局输入框对象,密码框添加隐藏输入 UserName = Entry(frame_entry, width=30, bg="white") UserName.grid(row=0, column=1, padx=5, pady=5) PassWord = Entry(frame_entry, width=30, bg="white", show="*") PassWord.grid(row=1, column=1, padx=5, pady=5) submit_button = Button(root, text="提交", width=10, command=submitlog) submit_button.grid(row=2, column=0, padx=0, pady=5) logout_button = Button(root, text="退出", width=10, command=logOut) logout_button.grid(row=2, column=1, padx=0, pady=5) root.mainloop() # 启动登录页 loginpage()
额外优化点
- 密码输入框添加
show="*",隐藏输入内容,提升安全性; - 增加
strip()处理输入,避免因空格导致的匹配失败; - 添加消息框提示,让用户直观看到验证结果;
- 使用
fetchone()获取单条结果,符合用户名唯一的业务逻辑,更高效。
内容的提问来源于stack exchange,提问作者WeakTexas 68965
相关产品推荐
相关产品推荐

