Python递归深度超出错误排查:QComboBox联动SQLite数据加载问题
解决Python递归深度超限错误(QComboBox + SQLite3场景)
嘿,我来帮你搞定这个递归深度炸锅的问题!从你描述的场景和代码片段来看,问题的根源很明确:你的category_change函数在更新QComboBox内容时,又触发了它的currentIndexChanged信号,导致函数反复调用自己,陷入无限递归,最终超出Python的递归深度限制。
下面给你几个实用的解决方案,按简洁度排序:
方案1:临时阻止控件发送信号(最推荐)
Qt的控件自带blockSignals()方法,可以临时关闭信号发送,等你更新完QComboBox内容后再恢复,这样就不会触发递归了:
def category_change(): # 先把QComboBox的信号发送关掉,避免递归触发 combo_box.blockSignals(True) # 数据库操作部分 conn = sqlite3.connect('storage/container.db') conn.row_factory = lambda c, row: row[0] c = conn.cursor() c.execute("SELECT category_name FROM categories") category_all = ['', ] category_all.extend(c.fetchall()) # 简化循环添加的写法 # 更新QComboBox内容 combo_box.clear() combo_box.addItems(category_all) # 恢复信号发送 combo_box.blockSignals(False) # 接下来处理QListWidget的填充逻辑 current_category = combo_box.currentText() if current_category: c.execute("SELECT item_name FROM items WHERE category = ?", (current_category,)) items = c.fetchall() list_widget.clear() list_widget.addItems(items) # 别忘了关闭数据库连接 conn.close()
方案2:断开再重新连接信号
如果你更习惯手动管理信号连接,可以在更新前断开currentIndexChanged与category_change的绑定,更新完成后再重新连接:
def category_change(): # 断开信号连接,防止递归 combo_box.currentIndexChanged.disconnect(category_change) # 数据库操作和QComboBox更新逻辑 conn = sqlite3.connect('storage/container.db') conn.row_factory = lambda c, row: row[0] c = conn.cursor() c.execute("SELECT category_name FROM categories") category_all = ['', ] for items in c.fetchall(): category_all.append(items) combo_box.clear() combo_box.addItems(category_all) # 重新连接信号 combo_box.currentIndexChanged.connect(category_change) # 填充QListWidget current_category = combo_box.currentText() if current_category: c.execute("SELECT item_name FROM items WHERE category = ?", (current_category,)) list_widget.clear() list_widget.addItems(c.fetchall()) conn.close()
额外优化小建议
- 数据库连接复用:别每次调用函数都新建连接,频繁开关会拖慢性能,可以考虑把数据库连接做成全局变量,或者在类初始化时创建连接,函数里直接用。
- 异常处理:给数据库操作加个
try-except块,比如捕获sqlite3.Error,避免因为数据库问题导致程序直接崩溃。 - 类结构优化:如果是在Qt的窗口类里写的逻辑,建议把数据库操作、控件更新拆成单独的方法,代码会更清晰易维护。
内容的提问来源于stack exchange,提问作者Ahmed Wagdi
相关产品推荐
相关产品推荐

