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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:38:21