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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:27:22