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

基于SQLite3的Tkinter登录系统无法匹配账号密码求助

问题定位与修复方案

核心问题分析

  1. 类型不匹配导致查询失败
    数据库中存储的密码1234是整数类型,但用户输入后获取到的是字符串类型,SQLite的WHERE条件会严格校验类型,因此即使输入正确的密码,也无法匹配到数据库中的记录。

  2. 重复插入冗余数据
    每次启动程序都会执行INSERT语句,导致login表中重复添加相同的账号密码记录,虽然不直接影响登录,但属于不合理的操作。

  3. 表结构不规范
    创建login表时未指定字段类型,可能引发数据存储的不可预期问题。

  4. 控件选型不合适
    使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:16:07