python学习之路-练习小程序03(三级菜单)

需求:
可依次选择进入各子菜单
可从任意一层往回退到上一层
可从任意一层退出程序
所需新知识点:列表、字典

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("菜单名输入错误,请重新输入")

 

posted @ 2018-04-14 22:31  zengwenhai  阅读(327)  评论(0编辑  收藏  举报