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

基于SQLite3的Tkinter登录切换Frame功能故障求助

问题:SQLite3+Tkinter图书管理系统登录功能异常

使用SQLite3开发图书管理系统,Tkinter窗口包含f1和f2两个Frame。f1实现登录功能,预期输入数据库中正确的用户名和密码后切换至f2,但无论输入正确与否,始终进入else分支提示"用户名或密码错误"。排查发现SELECT查询未返回任何结果,登录函数代码如下:

def Login():
    Connect()
    Username=StringVar()
    Password=StringVar()
    cursor.execute("SELECT * FROM Users WHERE username=? and password=?",(Username.get(), Password.get(),))
    connection.commit()
    users = cursor.fetchall()
    print(users)
    connection.commit()
    if users is True:
        f2.pack(fill='both', expand=1)
        f1.pack_forget()
    else:
        label1=Label(root,text="Wrong username or password, please try again")
        label1.place(x=350,y=300)
        e2.delete(0, END)

排查建议

  • StringVar未关联输入控件
    你在Login函数里新建的Username和Password两个StringVar,没有和登录界面的输入框(比如e1、e2)绑定,导致Username.get()和Password.get()永远返回空字符串。应该直接复用输入框绑定的变量,或者直接获取输入框的内容:

    # 假设用户名输入框是e1,密码输入框是e2
    username = e1.get().strip()
    password = e2.get().strip()
    cursor.execute("SELECT * FROM Users WHERE username=? and password=?",(username, password))
    
  • SELECT操作无需commit
    SQLite中只有写操作(INSERT/UPDATE/DELETE等)需要调用connection.commit(),SELECT查询不需要,代码里的两次commit属于冗余操作,直接删除即可。

  • 判断逻辑错误
    cursor.fetchall()返回的是查询结果的列表,即使有匹配数据,列表也不会等于True。应该判断列表是否非空:

    if users:  # 列表非空表示查询到匹配用户
        f2.pack(fill='both', expand=1)
        f1.pack_forget()
    else:
        # 错误提示逻辑
    
  • 额外排查点

    1. 检查数据库中Users表是否存在,username、password字段名是否拼写正确(SQLite默认大小写不敏感,但建议和代码保持一致)。
    2. 打印传入的参数值,确认用户名和密码是否正确获取:
      print("用户名:", username, "密码:", password)
      
    3. 直接在SQLite客户端执行相同的SELECT语句,验证是否能查询到结果,排除数据库数据本身的问题。
    4. 检查Connect()函数是否正确连接到目标数据库文件,避免连接到空数据库。

内容的提问来源于stack exchange,提问作者Hydie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:56:06