基于SQLite3的Tkinter登录系统无法匹配账号密码求助
问题定位与修复方案
核心问题分析
类型不匹配导致查询失败
数据库中存储的密码1234是整数类型,但用户输入后获取到的是字符串类型,SQLite的WHERE条件会严格校验类型,因此即使输入正确的密码,也无法匹配到数据库中的记录。重复插入冗余数据
每次启动程序都会执行INSERT语句,导致login表中重复添加相同的账号密码记录,虽然不直接影响登录,但属于不合理的操作。表结构不规范
创建login表时未指定字段类型,可能引发数据存储的不可预期问题。控件选型不合适
使用Text控件处理单行的账号密码输入,不如Entry控件更贴合场景,且Entry支持密码隐藏(通过show="*")。
修复后的完整代码
from tkinter import * from tkinter import messagebox import sqlite3 #------------------------------DB------------------------------------ # 连接数据库 con = sqlite3.connect('SeaSideDB.db') cur = con.cursor() # 创建带明确字段类型的表 cur.execute("CREATE TABLE IF NOT EXISTS login(ID TEXT PRIMARY KEY, PASSWORD TEXT)") # 仅当表中无数据时插入初始记录,避免重复插入 cur.execute("SELECT COUNT(*) FROM login WHERE ID = 'Juke'") count = cur.fetchone()[0] if count == 0: # 密码以字符串形式存储,匹配输入类型 cur.execute("INSERT INTO login VALUES ('Juke', '1234')") con.commit() #---------------------------END OF DB------------------------------------ #--------------------------LOGIN GUI-------------------------------------- root = Tk(className='Seaside Loyalty Login') root.geometry("500x150") # ID输入:改用Entry控件 L = Label(root, text="ID", font=("Courier",13)) L.pack() entry_id = Entry(root, width=25, font=("Courier",13)) entry_id.pack() # 密码输入:改用Entry并隐藏输入内容 L1 = Label(root, text="Password", font=("Courier",13)) L1.pack() entry_pwd = Entry(root, width=25, font=("Courier",13), show="*") entry_pwd.pack() #----------------------------END OF LOGIN GUI----------------------------------- # 登录验证函数 def login_check(user_id, password): cur = con.cursor() # 确保查询参数与存储类型一致(均为字符串) cur.execute("SELECT * FROM login WHERE ID = ? AND PASSWORD = ?", (user_id, password)) result = cur.fetchone() return result is not None # 校验输入并触发登录 def check_credentials(): user_id = entry_id.get().strip() password = entry_pwd.get().strip() if login_check(user_id, password): messagebox.showinfo("Login","Successful") else: messagebox.showerror("Login", "Invalid ID or Password") # 登录按钮 B = Button(root, text="Login", command=check_credentials) B.pack() root.mainloop() # 关闭数据库连接 con.close()
修改说明
- 将数据库中的密码改为字符串类型存储,确保与输入的字符串类型匹配;
- 添加判断逻辑,仅当指定账号不存在时才插入初始数据,避免重复插入;
- 明确
login表的字段类型,ID设为主键避免重复账号; - 替换
Text控件为Entry控件,更适合单行输入场景,密码输入添加show="*"实现隐藏; - 优化函数命名,让代码逻辑更清晰。
内容的提问来源于stack exchange,提问作者CokeZero93
相关产品推荐
相关产品推荐

