需求:
可依次选择进入各子菜单
可从任意一层往回退到上一层
可从任意一层退出程序
所需新知识点:列表、字典1.基础版:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:zengwenhai
# 三级菜单
menu =
{
'湖南省':{
'郴州市':{
'嘉禾县':{
'珠泉镇':{},
'袁家镇':{},
'泮头乡':{}
},
'汝城县':{
'土桥镇':{},
'永丰乡':{},
'田庄':{}
},
'安仁县':{
'灵官镇':{},
'关山镇':{}
}
},
'常德市':{
'汉寿县':{
'蒋家嘴镇':{},
'坡头镇':{}
},
'安乡县':{
'安丰乡':{},
'安生乡':{}
},
'桃源县':{}
}
},
'广东省':{
'深圳市':{
'宝安区':{
'西乡':{},
'固戍':{}
},
'南山':{
'中兴':{},
'深圳大学':{}
}
},
'广州市':{
'越秀区':{
'火车站':{},
'越秀公园':{}
}
},
},
}
stop_flag = False
# 定义一个循环各级菜单的标志位,这个标志的作用:当用户输入某个字符时停留在本级菜单上
break_flag = False
# 定义一个循环各级菜单的标志位,这个标志的作用:当用户输入某个字符时返回上一级菜单上
flag_list = [
's',
'b']
# 用来判断输入的菜单名是s或b时,不会提示:第xx级菜单名输入错误,请重新输入
while not break_flag:
print(
"第一级菜单>>>>>")
print(
"==========")
for k
in menu:
print(k)
print(
"==========================================================")
choicename = input(
"请输入第一级菜单名[s|S跳出程序---b|B返回上一级菜单]:").strip().lower()
# 去除输入项左右空格,如果是输入字母,统一转换为小写
print(
"==========")
if choicename
in menu:
while not stop_flag
and not break_flag:
for k1
in menu[choicename]:
print(k1)
print(
"==========================================================")
choicename1 = input(
"请输入第二级菜单名[s|S跳出程序---b|B返回上一级菜单]:").strip().lower()
print(
"==========")
if choicename1 ==
's':
# 当输入的是s时,跳出程序
exit()
elif choicename1 ==
'b':
# 当输入b时,将break_flag标志置为True,本循环层不开始,返回上一层
break_flag =
True
if choicename1
in menu[choicename]:
print(
"第三级菜单名")
print(
"==========")
while not stop_flag
and not break_flag:
for k2
in menu[choicename][choicename1]:
print(k2)
print(
"==========================================================")
choicename2 = input(
"请输入第三级菜单名[s|S跳出程序---b|B返回上一级菜单]:").strip().lower()
if choicename2 ==
's':
exit()
elif choicename2 ==
'b':
break_flag =
True
if choicename2
in menu[choicename][choicename1]:
while not stop_flag
and not break_flag:
print(
"第四级菜单名")
print(
"==========")
for k3
in menu[choicename][choicename1][choicename2]:
print(k3)
print(
"==========================================================")
choicename3 = input(
"请输入s或b[s|S停留在本级菜单---b|B返回上一级菜单]:").strip().lower()
print(
"==========")
if choicename3 ==
's':
exit()
elif choicename3 ==
'b':
break_flag =
True
else:
print(
"这是最后一级菜单")
else:
# while块下对应的else,如果while循环中未中断,执行此语句,给break_flag标志位重新赋值为False,确保第三级菜单可以正常循环
break_flag =
False
elif choicename2
in flag_list:
# 此处是避免输入s或b,程序停在当前菜单层或返回上级菜单层时提示:第xx级菜单名输入错误,请重新输入ps.不加这个判断的话,程序会返回上级菜单,但是也会报菜单名错误
pass
else:
print(
"第三级菜单名输入错误,请重新输入")
else:
# while块下对应的else,如果while循环中未中断,执行此语句,给break_flag标志位重新赋值为False,确保第二级菜单可以正常循环
break_flag =
False
elif choicename1
in flag_list:
pass
else:
print(
"第二级菜单名输入错误,请重新输入")
else:
# while块下对应的else,如果while循环中未中断,执行此语句,给break_flag标志位重新赋值为False,确保第一级菜单可以正常循环
break_flag =
False
elif choicename
in flag_list:
pass
else:
print(
"第一级菜单名输入错误,请重新输入!")
2.升级版:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:zengwenhai
# 三级菜单
menu =
{
'湖南省':{
'郴州市':{
'嘉禾县':{
'珠泉镇':{},
'袁家镇':{},
'泮头乡':{}
},
'汝城县':{
'土桥镇':{},
'永丰乡':{},
'田庄':{}
},
'安仁县':{
'灵官镇':{},
'关山镇':{}
}
},
'常德市':{
'汉寿县':{
'蒋家嘴镇':{},
'坡头镇':{}
},
'安乡县':{
'安丰乡':{},
'安生乡':{}
},
'桃源县':{}
}
},
'广东省':{
'深圳市':{
'宝安区':{
'西乡':{},
'固戍':{}
},
'南山':{
'中兴':{},
'深圳大学':{}
}
},
'广州市':{
'越秀区':{
'火车站':{},
'越秀公园':{}
}
},
},
}
tmp = menu
# 用来存储菜单名的临时中间变量
flag =
False
count = 1
parent_menu = []
# 定义一个空列表,用来存储每次循环后的上级菜单名
while not flag:
print(
"<<<<<<<<打印菜单名>>>>>>>>")
for k
in tmp:
print(k)
choice = input(
"请输入菜单名[s|S跳出程序---b|B返回上一级菜单]:").strip().lower()
if choice
in tmp:
parent_menu.append(tmp) # 把上级菜单名添加到列表里
tmp =
tmp[choice]
elif choice ==
'b':
if parent_menu:
# 判断列表非空,不加判断的话,从最末级菜单层层返回上级菜单,最后列表会变为空,再执行pop方法时报错
tmp = parent_menu.pop()
# 通过pop方法取出上级菜单名,并重新赋值给中间变量
elif choice ==
's':
exit()
else:
print(
"菜单名输入错误,请重新输入")
转载于:https://www.cnblogs.com/zengwenhai/p/8836215.html