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

PyQt6变量修改及披萨点餐APP计费异常、NameError问题求助

问题排查与解决方法

问题1:未选择饮品/披萨仍收取对应费用

原因:

  • 披萨价格PizzaPrice1、PizzaPrice2直接硬编码为10,无论用户是否选择对应披萨,都会被强制计入总价
  • 饮品价格未设置默认值,即便未选择任何饮品,后续计算仍会尝试加入未正确初始化的费用

问题2:NameError: name 'DrPrice1' is not defined

原因:

  • DrPrice1是定义在AddDrink函数内部各个if/elif分支里的局部嵌套函数,函数外部无法访问该名称
  • 就算能访问,DrPrice = (DrPrice1)只是将函数对象本身赋值给DrPrice,并未执行函数获取价格,逻辑完全错误

修复后的代码示例

# 初始化默认价格为0,未选择对应商品时不产生费用
DrPrice = 0
PizzaPrice1 = 0
PizzaPrice2 = 0
DroneFee = 5

def AddDrink():
    global DrPrice  # 声明使用全局变量DrPrice
    if DrinkUI.CokeCheck.isChecked():
        CheckoutUI.DrinkOrder.setText("Coke Classic")
        CheckoutUI.DrinkPrice.setText("5")
        DrPrice = 5
    elif DrinkUI.CokeZCheck.isChecked():
        CheckoutUI.DrinkOrder.setText("Coke Zero")
        CheckoutUI.DrinkPrice.setText("5")
        DrPrice = 5
    elif DrinkUI.FantaCheck.isChecked():
        CheckoutUI.DrinkOrder.setText("Fanta")
        CheckoutUI.DrinkPrice.setText("5")
        DrPrice = 5
    elif DrinkUI.AJCheck.isChecked():
        CheckoutUI.DrinkOrder.setText("Apple Juice")
        CheckoutUI.DrinkPrice.setText("5")
        DrPrice = 5
    elif DrinkUI.WaterCheck.isChecked():
        CheckoutUI.DrinkOrder.setText("Water")
        CheckoutUI.DrinkPrice.setText("5")
        DrPrice = 5
    else:
        # 未选择任何饮品时重置显示和价格
        CheckoutUI.DrinkOrder.setText("")
        CheckoutUI.DrinkPrice.setText("0")
        DrPrice = 0

# 新增披萨选择处理函数,逻辑与饮品保持一致
def AddPizza1():
    global PizzaPrice1
    if PizzaUI.Pizza1Check.isChecked():
        PizzaPrice1 = 10
        CheckoutUI.Pizza1Order.setText("XX披萨")
        CheckoutUI.Pizza1Price.setText("10")
    else:
        PizzaPrice1 = 0
        CheckoutUI.Pizza1Order.setText("")
        CheckoutUI.Pizza1Price.setText("0")

def AddPizza2():
    global PizzaPrice2
    if PizzaUI.Pizza2Check.isChecked():
        PizzaPrice2 = 10
        CheckoutUI.Pizza2Order.setText("YY披萨")
        CheckoutUI.Pizza2Price.setText("10")
    else:
        PizzaPrice2 = 0
        CheckoutUI.Pizza2Order.setText("")
        CheckoutUI.Pizza2Price.setText("0")

# 封装总价计算逻辑,用户选择变化时可随时调用更新
def CalculateTotal():
    global DrPrice, PizzaPrice1, PizzaPrice2, DroneFee
    ItemTotalPr = PizzaPrice1 + PizzaPrice2 + DrPrice
    Total = ItemTotalPr + DroneFee
    # 更新结账UI的总价显示
    CheckoutUI.ItemTotal.setText(str(ItemTotalPr))
    CheckoutUI.FinalTotal.setText(str(Total))

关键优化点

  • 所有价格变量初始化默认值为0,未选择商品时不产生费用
  • 移除不必要的嵌套函数,直接通过全局变量更新价格(若采用面向对象开发,可改用类属性替代全局变量)
  • 新增未选择商品时的UI重置逻辑,保证显示内容与实际价格一致
  • 将总价计算封装为独立函数,便于在用户选择变动时快速更新结果

内容的提问来源于stack exchange,提问作者Cereal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:22:40