sum_all函数在sum_all_invoice内调用触发RecursionError问题排查
解决递归错误并正确计算总金额
问题根源
你在sum_all函数内部的sum_all_invoice里调用sum_all(),触发了无限递归:每次执行sum_all都会调用sum_all_invoice,而sum_all_invoice又会再次调用sum_all,循环往复直到超出Python的递归深度限制。
修复方案
把计算餐品总价的核心逻辑抽成独立函数,避免重复调用包含UI更新操作的整个sum_all。具体调整:
- 新增独立函数专门计算餐品标签的总和,不涉及UI操作
- 让
sum_all和sum_all_invoice都调用这个独立函数获取餐品总价,不再互相嵌套调用
修复后的完整代码
def calculate_meal_total(self): total = 0 # 遍历6个餐品标签计算总和 for i in range(1, 7): label_name = f"meal_{i}_line" label = getattr(self.ui, label_name, None) if not label: continue label_text = label.text() try: total += int(label_text) except ValueError: print(f"Error: {label_name}标签内不是数字,默认加0") total += 0 return total def sum_all(self): # 获取餐品总价 meal_total = self.calculate_meal_total() # 更新餐品总价UI self.ui.price_line.setText(str(meal_total)) # VAT计算 def vat(total): return total * 0.18 vat_value = vat(meal_total) self.ui.vat_line.setText(str(vat_value)) # 服务费计算 def service(total): return total * 0.1 service_charge = service(meal_total) self.ui.service_charge_line.setText(str(service_charge)) # 计算总金额 def sum_all_invoice(): meal_value = self.calculate_meal_total() vat_value = vat(meal_value) service_value = service(meal_value) return vat_value + service_value + meal_value total_invoice = sum_all_invoice() self.ui.subtotal_line.setText(str(total_invoice)) # 按钮点击绑定 self.ui.total_button.clicked.connect(self.sum_all)
额外优化建议
- 把
vat和service这类通用计算函数移到sum_all外部,避免每次调用sum_all都重复定义 - 可以给
calculate_meal_total增加参数,灵活控制遍历的餐品数量,适配不同场景
内容的提问来源于stack exchange,提问作者kittycat
相关产品推荐
相关产品推荐

