Python字典菜单与子菜单开发问题:TXT数据导入实现困惑
问题解决:Python字典菜单与子菜单实现
核心问题
- 已完成主菜单,不知道如何进入并实现蔬菜子菜单的交互逻辑
- 询问水果子菜单是否可以采用与蔬菜子菜单相同的实现方式
原代码问题修正
先修正原代码中的几个错误:
- 变量名错误:
dici应为basket,否则会报未定义错误 - 缩进错误:子菜单的条件判断未正确缩进
- 变量名不一致:
opcao_legume应为option_vegetable - 文件操作未关闭:改用
with语句自动管理文件,避免资源泄漏
子菜单实现思路
1. 蔬菜子菜单实现
在主菜单的option == "c"分支中,调用蔬菜子菜单函数,并在子菜单内部做循环,直到用户选择返回主菜单。核心是通过子菜单内部的循环维持交互,不打断主菜单的循环逻辑。
2. 水果子菜单实现
完全可以采用和蔬菜子菜单相同的实现方式,甚至可以封装通用函数减少重复代码,本质都是对字典中对应分类的列表进行增删改查操作。
完整修正代码
#################### 导入TXT文件并读取为字典 basket = {"vegetable": [], "fruit": []} # 用with语句自动管理文件,更安全 with open("fruits_vegetables.txt", "r", encoding="UTF-8-SIG") as fp: cont = fp.readlines() for linha in cont: dados = linha.strip().split(",") # 去掉换行符再分割 if len(dados) == 2: # 确保每行格式正确,避免索引错误 basket[dados[0]].append(dados[1]) ########################################### def main_menu(): print("\nM E N U") print("a. 显示购物篮") print("b. 清屏") print("c. 蔬菜子菜单") print("d. 水果子菜单") print("e. 退出程序") def vegetable_submenu(): while True: print("\nV E G E T A B L E S") print("1. 列出所有蔬菜") print("2. 删除蔬菜") print("3. 添加蔬菜") print("4. 编辑蔬菜名称") print("5. 返回主菜单") option = input("请选择选项: ") if option == "1": print("蔬菜列表:", basket["vegetable"]) elif option == "2": veg = input("请输入要删除的蔬菜名称: ") if veg in basket["vegetable"]: basket["vegetable"].remove(veg) print(f"已删除蔬菜: {veg}") else: print("该蔬菜不在列表中") elif option == "3": veg = input("请输入要添加的蔬菜名称: ") basket["vegetable"].append(veg) print(f"已添加蔬菜: {veg}") elif option == "4": old_veg = input("请输入要编辑的蔬菜名称: ") if old_veg in basket["vegetable"]: new_veg = input("请输入新的蔬菜名称: ") idx = basket["vegetable"].index(old_veg) basket["vegetable"][idx] = new_veg print(f"已将{old_veg}修改为{new_veg}") else: print("该蔬菜不在列表中") elif option == "5": break # 退出子菜单,返回主菜单 else: print("请选择有效的选项!") def fruit_submenu(): # 和蔬菜子菜单逻辑完全一致,仅操作basket["fruit"] while True: print("\nF R U I T S") print("1. 列出所有水果") print("2. 删除水果") print("3. 添加水果") print("4. 编辑水果名称") print("5. 返回主菜单") option = input("请选择选项: ") if option == "1": print("水果列表:", basket["fruit"]) elif option == "2": fruit = input("请输入要删除的水果名称: ") if fruit in basket["fruit"]: basket["fruit"].remove(fruit) print(f"已删除水果: {fruit}") else: print("该水果不在列表中") elif option == "3": fruit = input("请输入要添加的水果名称: ") basket["fruit"].append(fruit) print(f"已添加水果: {fruit}") elif option == "4": old_fruit = input("请输入要编辑的水果名称: ") if old_fruit in basket["fruit"]: new_fruit = input("请输入新的水果名称: ") idx = basket["fruit"].index(old_fruit) basket["fruit"][idx] = new_fruit print(f"已将{old_fruit}修改为{new_fruit}") else: print("该水果不在列表中") elif option == "5": break else: print("请选择有效的选项!") # 主程序循环 main_menu() option = input("请选择选项: ") while option != "e": if option == "a": for category, items in basket.items(): print(f"{category}: {items}") elif option == "b": print("\n" * 15) elif option == "c": vegetable_submenu() # 进入蔬菜子菜单 elif option == "d": fruit_submenu() # 进入水果子菜单 else: print("请选择有效的选项!") print() main_menu() option = input("请选择选项: ") print("感谢使用本程序。")
关键说明
- 子菜单通过内部循环维持交互,直到用户选择返回主菜单(选项5),不影响主菜单的循环逻辑
- 水果子菜单完全复用了蔬菜子菜单的逻辑,仅操作的字典键不同,证明可以采用相同实现方式
- 优化了文件读取逻辑,添加格式校验避免索引错误
内容的提问来源于stack exchange,提问作者Rodriguez
相关产品推荐
相关产品推荐

