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
相关产品推荐
相关产品推荐

