基于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: # 错误提示逻辑额外排查点
- 检查数据库中
Users表是否存在,username、password字段名是否拼写正确(SQLite默认大小写不敏感,但建议和代码保持一致)。 - 打印传入的参数值,确认用户名和密码是否正确获取:
print("用户名:", username, "密码:", password) - 直接在SQLite客户端执行相同的SELECT语句,验证是否能查询到结果,排除数据库数据本身的问题。
- 检查
Connect()函数是否正确连接到目标数据库文件,避免连接到空数据库。
- 检查数据库中
内容的提问来源于stack exchange,提问作者Hydie
相关产品推荐
相关产品推荐

