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

Python Tkinter点餐项目:如何在三维列表中查找食物对应价格?

解决方法

问题原因

你当前的判断逻辑失效,是因为self.food_list是三维嵌套结构:

  • 第一层是食物分类列表(沙拉/三明治/热食三个子列表)
  • 第二层是单个分类下的所有食物列表
  • 第三层才是单个食物的[ID, 名称, 价格]子项
    你直接判断食物名称字符串是否在三维列表中,匹配的是第一层的分类列表,自然不可能找到结果。

修复方案

方案1:遍历三维列表匹配食物名称

直接修改confirm_order方法,逐层遍历列表匹配选中的食物名,同时取出相邻的ID和价格值:

def confirm_order(self):
    selected_food_name = self.r.get()
    # 先判断用户有没有选食物
    if not selected_food_name:
        messagebox.showwarning("提示", "请先选择您要购买的食物")
        return
    
    food_id = None
    food_price = None
    # 逐层遍历三维列表
    for category in self.food_list:
        for food_item in category:
            # food_item[1] 就是食物名称,和选中值匹配
            if food_item[1] == selected_food_name:
                food_id = food_item[0]
                food_price = food_item[2]
                break
        # 找到就跳出外层循环
        if food_id is not None:
            break
    
    if food_id is not None:
        # 把ID填充到界面输入框
        self.food_id_entry.delete(0, END)
        self.food_id_entry.insert(0, str(food_id))
        # 如果你需要显示价格,自己加个Label组件在这里更新即可
        print(f"订单确认:{selected_food_name},价格${food_price:.2f}")
        # 调用存库方法
        self.take_order()
    else:
        messagebox.showerror("错误", "未找到匹配的食物信息")

方案2(优化推荐):修改单选按钮取值逻辑

你现在单选按钮存的是食物名称,不仅匹配效率低,还可能出现重名问题,直接把value改成存食物ID会更方便:
比如把原来的单选按钮代码:

self.tab1_rbut1 = ttk.Radiobutton(self.tab1, variable=self.r, value=self.food_list[0][0][1])

改成:

self.tab1_rbut1 = ttk.Radiobutton(self.tab1, variable=self.r, value=self.food_list[0][0][0])

后续匹配的时候直接用ID查找,遍历速度更快,也不存在匹配失败的问题。

其他注意事项

你提供的完整代码里有缩进错误:Tabs方法中创建tab2、tab3的代码缩进不对,属于方法外的代码,运行会直接报错,需要把这部分代码的缩进调整到Tabs方法内部。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 10:54:04