将QLineEdit.text()插入SQLite3表报错sqlite3.InterfaceError,求解决
解决SQLite插入错误与QListWidget刷新问题
一、先搞定sqlite3.InterfaceError类型错误
这个错误的根源很明确:你从QLineEdit.text()拿到的是PyQt4的QString对象,而SQLite3的参数绑定只认Python原生的数据类型(比如str、int),直接传QString就会触发类型不兼容的报错。
修正方法很简单,把QString转成Python原生字符串就行,推荐用PyQt4的原生方法更稳妥:
input_user = self.lineEdit.text().toPyString()
下面是修正后的插入代码,我还加了异常处理和资源自动管理(用with语句自动关闭数据库连接,避免资源泄漏):
def proc(self): # 注意要加self,作为类成员函数 # 1. 转换输入为Python原生字符串,同时判断空输入 input_user = self.lineEdit.text().toPyString().strip() if not input_user: print("请输入分类名称") return try: # with语句自动管理连接,无需手动close with sqlite3.connect('storage/container.db') as conn: cursor = conn.cursor() # 用参数化查询,占位符用?是SQLite的标准写法 cursor.execute("INSERT INTO categories (category_name) VALUES (?)", (input_user,)) conn.commit() print("分类添加成功") # 插入成功后直接触发刷新 self.refresh_category_list() # 可选:清空输入框提升体验 self.lineEdit.clear() except sqlite3.IntegrityError: # 处理分类名称唯一约束的异常(重复插入同名分类) print("这个分类名称已经存在啦,请换一个") except Exception as e: print(f"添加出错:{str(e)}")
二、插入后刷新QListWidget列表
单独写一个刷新列表的函数,插入成功后调用它,就能让列表实时显示最新数据:
def refresh_category_list(self): # 先清空现有列表内容 self.listWidget.clear() try: with sqlite3.connect('storage/container.db') as conn: cursor = conn.cursor() # 按id升序查询所有分类 cursor.execute("SELECT category_name FROM categories ORDER BY id ASC") categories = cursor.fetchall() # 把每个分类添加到列表里 for category in categories: self.listWidget.addItem(category[0]) # fetchall返回元组,取第一个元素 except Exception as e: print(f"刷新列表出错:{str(e)}")
额外小提示
- 确保
storage文件夹存在,不然数据库连接会报错,可以在启动时加个判断创建文件夹 - 把这两个函数都定义为你的窗口类的成员函数,这样才能通过
self调用控件和数据库操作
内容的提问来源于stack exchange,提问作者Ahmed Wagdi
相关产品推荐
相关产品推荐

