Python 三级菜单

三级菜单

任务要求:

  • 1、列出菜单信息提供用户选择
  • 2、根据用户选择进入下级菜单
  • 3、用户输入b返回上一级菜单
  • 4、用户输入q直接退出系统

流程图

代码

1、主文件

#!/usr/bin/env python
# -*- conding:utf-8 -*-
# create a menu system

# 20230616
# evescn

import sys
import yaml


def myinput():
    # 输出提示信息的函数
    print("输入q退出系统")
    print("输入b返回上一级菜单")
    key = input("请输入对应的名称进入下级菜单:")
    return key


def mycity(key):
    # 输出市级别信息的函数
    print("-------------------------------------------------")
    for i, m in enumerate(menu[str(key)], 1):
        for item in m.keys():
            print("    ", i, item)
    key = myinput()
    return key


def mycounty(key1, key2):
    # 输出县基本信息的函数
    print("-------------------------------------------------")
    for i, m in enumerate(menu[str(key1)], 1):
        for item in m.keys():
            if item == key2:
                for i, item in enumerate(m[str(item)], 1):
                    print("    ", i, item)
    key = myinput()
    return key


def mymunici(key):
    # 输出4个直辖市的函数
    print("-------------------------------------------------")
    for i, item in enumerate(menu[str(key)], 1):
        print("    ", i, item)
    key = myinput()
    return key


def mysar(key):
    # 输出特别行政区的函数
    print("-------------------------------------------------")
    # for i, item in enumerate(menu[str(key)], 1):
    i = 1
    print("    ", i, menu[str(key)])
    key = myinput()
    return key


def exitorcontinue(key):
    # 判断用户键入的值,以便判断是否退出或返回上一级
    if key == 'q':
        sys.exit("感谢使用查询系统")
    elif key == 'b':
        return 0


# 导入yaml文件,并转换为字典格式
with open('pro.yaml', 'r', encoding='utf-8') as f:
    menu = yaml.load(f, Loader=yaml.SafeLoader)

# 定义直辖市列表,判断用户输入是否为直辖市
municipalities = ['北京市', '上海市', '重庆市', '天津市', ]

# 定义特别行政区
SAR = ['香港', '澳门', '台湾', '钓鱼岛', ]

# 定义在省级错误次数
n = 3

while True:
    if n == 0:  # 3次输入不正确直接退出系统
        sys.exit("感谢使用查询系统")

    print("-------------------------------------------------")
    for i, item in enumerate(menu.keys(), 1):  # 列出整个省级菜单
        print("    ", i, item)

    key1 = myinput()

    if key1 == 'q' or key1 == 'b':  # 判断此次键入的值是否为q,b
        sys.exit("感谢使用查询系统")

    if key1 not in menu.keys():  # 判断此次键入的值是否在所有可选的省级菜单中
        n -= 1
        print("-------------------------------------------------")
        print("你输入的省份不对,请重新输入")
        print("你还有%s次机会,否则将直接退出系统" % n)
        continue

    while True:
        if key1 in municipalities:  # 判断是否属于直辖市
            key2 = mymunici(key1)

            if exitorcontinue(key2) == 0:
                break
        elif key1 in SAR:  # 判断是否属于特别行政区
            key2 = mysar(key1)

            if exitorcontinue(key2) == 0:
                break
        else:  # 不属于直辖市
            key2 = mycity(key1)
            if exitorcontinue(key2) == 0:
                break

            while True:  # 查找第三级县菜单
                key3 = mycounty(key1, key2)

                if exitorcontinue(key3) == 0:
                    break

2、省市县文件

省市县文件
香港:
  香港
澳门:
  澳门
台湾:
  台湾
钓鱼岛:
  钓鱼岛
北京市:
  - 市辖区
  - 东城区
  - 西城区
  - 崇文区
  - 宣武区
  - 朝阳区
  - 丰台区
  - 石景山区
  - 海淀区
  - 门头沟区
  - 房山区
  - 通州区
  - 顺义区
  - 昌平区
  - 大兴区
  - 怀柔区
  - 平谷区
  - 密云县
  - 延庆县
天津市:
  - 市辖区
  - 和平区
  - 河东区
  - 河西区
  - 南开区
  - 河北区
  - 红桥区
  - 塘沽区
  - 汉沽区
  - 大港区
  - 东丽区
  - 西青区
  - 津南区
  - 北辰区
  - 武清区
  - 宝坻区
  - 宁河县
  - 静海县
  - 蓟 县
河北省:
  - 石家庄市:
    - 长安区
    - 桥东区
    - 桥西区
    - 新华区
    - 井陉矿区
    - 裕华区
    - 井陉县
    - 正定县
    - 栾城县
    - 行唐县
    - 灵寿县
    - 高邑县
    - 深泽县
    - 赞皇县
    - 无极县
    - 平山县
    - 元氏县
    - 赵县
    - 辛集市
    - 藁城市
    - 晋州市
    - 新乐市
    - 鹿泉市
  - 唐山市:
    - 路南区
    - 路北区
    - 古冶区
    - 开平区
    - 丰南区
    - 丰润区
    - 滦县
    - 滦南县
    - 乐亭县
    - 迁西县
    - 玉田县
    - 唐海县
    - 遵化市
    - 迁安市
  - 秦皇岛市:
    - 海港区
    - 山海关区
    - 北戴河区
    - 青龙满族自治县
    - 昌黎县
    - 抚宁县
    - 卢龙县
  - 邯郸市:
    - 邯山区
    - 丛台区
    - 复兴区
    - 峰峰矿区
    - 邯郸县
    - 临漳县
    - 成安县
    - 大名县
    - 涉 县
    - 磁 县
    - 肥乡县
    - 永年县
    - 邱 县
    - 鸡泽县
    - 广平县
    - 馆陶县
    - 魏 县
    - 曲周县
    - 武安市
  - 邢台市:
    - 桥东区
    - 桥西区
    - 邢台县
    - 临城县
    - 内丘县
    - 柏乡县
    - 隆尧县
    - 任 县
    - 南和县
    - 宁晋县
    - 巨鹿县
    - 新河县
    - 广宗县
    - 平乡县
    - 威 县
    - 清河县
    - 临西县
    - 南宫市
    - 沙河市
  - 保定市:
    - 新市区
    - 北市区
    - 南市区
    - 满城县
    - 清苑县
    - 涞水县
    - 阜平县
    - 徐水县
    - 定兴县
    - 唐 县
    - 高阳县
    - 容城县
    - 涞源县
    - 望都县
    - 安新县
    - 易 县
    - 曲阳县
    - 蠡 县
    - 顺平县
    - 博野县
    - 雄 县
    - 涿州市
    - 定州市
    - 安国市
    - 高碑店市
  - 张家口市:
    - 桥东区
    - 桥西区
    - 宣化区
    - 下花园区
    - 宣化县
    - 张北县
    - 康保县
    - 沽源县
    - 尚义县
    - 蔚 县
    - 阳原县
    - 怀安县
    - 万全县
    - 怀来县
    - 涿鹿县
    - 赤城县
    - 崇礼县
  - 承德市:
    - 双桥区
    - 双滦区
    - 鹰手营子矿区
    - 承德县
    - 兴隆县
    - 平泉县
    - 滦平县
    - 隆化县
    - 丰宁满族自治县
    - 宽城满族自治县
    - 围场满族蒙古族自治县
  - 沧州市:
    - 新华区
    - 运河区
    - 沧 县
    - 青 县
    - 东光县
    - 海兴县
    - 盐山县
    - 肃宁县
    - 南皮县
    - 吴桥县
    - 献 县
    - 孟村回族自治县
    - 泊头市
    - 任丘市
    - 黄骅市
    - 河间市
  - 廊坊市:
    - 安次区
    - 广阳区
    - 固安县
    - 永清县
    - 香河县
    - 大城县
    - 文安县
    - 大厂回族自治县
    - 霸州市
    - 三河市
  - 衡水市:
    - 桃城区
    - 枣强县
    - 武邑县
    - 武强县
    - 饶阳县
    - 安平县
    - 故城县
    - 景 县
    - 阜城县
    - 冀州市
    - 深州市
山西省:
  - 太原市:
    - 小店区
    - 迎泽区
    - 杏花岭区
    - 尖草坪区
    - 万柏林区
    - 晋源区
    - 清徐县
    - 阳曲县
    - 娄烦县
    - 古交市
  - 大同市:
    - 城 区
    - 矿 区
    - 南郊区
    - 新荣区
    - 阳高县
    - 天镇县
    - 广灵县
    - 灵丘县
    - 浑源县
    - 左云县
    - 大同县
  - 阳泉市:
    - 城 区
    - 矿 区
    - 郊 区
    - 平定县
    - 盂 县
  - 长治市:
    - 城 区
    - 郊 区
    - 长治县
    - 襄垣县
    - 屯留县
    - 平顺县
    - 黎城县
    - 壶关县
    - 长子县
    - 武乡县
    - 沁 县
    - 沁源县
    - 潞城市
  - 晋城市:
    - 城 区
    - 沁水县
    - 阳城县
    - 陵川县
    - 泽州县
    - 高平市
    - 朔城区
    - 平鲁区
    - 山阴县
    - 应 县
    - 右玉县
    - 怀仁县
  - 晋中市:
    - 榆次区
    - 榆社县
    - 左权县
    - 和顺县
    - 昔阳县
    - 寿阳县
    - 太谷县
    - 祁 县
    - 平遥县
    - 灵石县
    - 介休市
  - 运城市:
    - 盐湖区
    - 临猗县
    - 万荣县
    - 闻喜县
    - 稷山县
    - 新绛县
    - 绛 县
    - 垣曲县
    - 夏 县
    - 平陆县
    - 芮城县
    - 永济市
    - 河津市
  - 忻州市:
    - 忻府区
    - 定襄县
    - 五台县
    - 代 县
    - 繁峙县
    - 宁武县
    - 静乐县
    - 神池县
    - 五寨县
    - 岢岚县
    - 河曲县
    - 保德县
    - 偏关县
    - 原平市
  - 临汾市:
    - 尧都区
    - 曲沃县
    - 翼城县
    - 襄汾县
    - 洪洞县
    - 古 县
    - 安泽县
    - 浮山县
    - 吉 县
    - 乡宁县
    - 大宁县
    - 隰 县
    - 永和县
    - 蒲 县
    - 汾西县
    - 侯马市
    - 霍州市
  - 吕梁市:
    - 离石区
    - 文水县
    - 交城县
    - 兴 县
    - 临 县
    - 柳林县
    - 石楼县
    - 岚 县
    - 方山县
    - 中阳县
    - 交口县
    - 孝义市
    - 汾阳市
内蒙古自治区:
  - 呼和浩特市:
    - 新城区
    - 回民区
    - 玉泉区
    - 赛罕区
    - 土默特左旗
    - 托克托县
    - 和林格尔县
    - 清水河县
    - 武川县
  - 包头市:
    - 东河区
    - 昆都仑区
    - 青山区
    - 石拐区
    - 白云矿区
    - 九原区
    - 土默特右旗
    - 固阳县
    - 达尔罕茂明安联合旗
    - 海勃湾区
    - 海南区
    - 乌达区
  - 赤峰市:
    - 红山区
    - 元宝山区
    - 松山区
    - 阿鲁科尔沁旗
    - 巴林左旗
    - 巴林右旗
    - 林西县
    - 克什克腾旗
    - 翁牛特旗
    - 喀喇沁旗
    - 宁城县
    - 敖汉旗
  - 通辽市:
    - 科尔沁区
    - 科尔沁左翼中旗
    - 科尔沁左翼后旗
    - 开鲁县
    - 库伦旗
    - 奈曼旗
    - 扎鲁特旗
    - 霍林郭勒市
  - 鄂尔多斯市:
    - 东胜区
    - 达拉特旗
    - 准格尔旗
    - 鄂托克前旗
    - 鄂托克旗
    - 杭锦旗
    - 乌审旗
    - 伊金霍洛旗
  - 呼伦贝尔市:
    - 海拉尔区
    - 阿荣旗
    - 莫力达瓦达斡尔族自治旗
    - 鄂伦春自治旗
    - 鄂温克族自治旗
    - 陈巴尔虎旗
    - 新巴尔虎左旗
    - 新巴尔虎右旗
    - 满洲里市
    - 牙克石市
    - 扎兰屯市
    - 额尔古纳市
    - 根河市
  - 巴彦淖尔市:
    - 临河区
    - 五原县
    - 磴口县
    - 乌拉特前旗
    - 乌拉特中旗
    - 乌拉特后旗
    - 杭锦后旗
  - 乌兰察布市:
    - 集宁区
    - 卓资县
    - 化德县
    - 商都县
    - 兴和县
    - 凉城县
    - 察哈尔右翼前旗
    - 察哈尔右翼中旗
    - 察哈尔右翼后旗
    - 四子王旗
    - 丰镇市
  - 兴安盟:
    - 乌兰浩特市
    - 阿尔山市
    - 科尔沁右翼前旗
    - 科尔沁右翼中旗
    - 扎赉特旗
    - 突泉县

  - 锡林郭勒盟:
    - 二连浩特市
    - 锡林浩特市
    - 阿巴嘎旗
    - 苏尼特左旗
    - 苏尼特右旗
    - 东乌珠穆沁旗
    - 西乌珠穆沁旗
    - 太仆寺旗
    - 镶黄旗
    - 正镶白旗
    - 正蓝旗
    - 多伦县
  - 阿拉善盟:
    - 阿拉善左旗
    - 阿拉善右旗
    - 额济纳旗
辽宁省:
  - 沈阳市:
    - 和平区
    - 沈河区
    - 大东区
    - 皇姑区
    - 铁西区
    - 苏家屯区
    - 东陵区
    - 沈北新区*
    - 于洪区
    - 辽中县
    - 康平县
    - 法库县
    - 新民市
  - 大连市:
    - 中山区
    - 西岗区
    - 沙河口区
    - 甘井子区
    - 旅顺口区
    - 金州区
    - 长海县
    - 瓦房店市
    - 普兰店市
    - 庄河市
  - 鞍山市:
    - 铁东区
    - 铁西区
    - 立山区
    - 千山区
    - 台安县
    - 岫岩满族自治县
    - 海城市
  - 抚顺市:
    - 新抚区
    - 东洲区
    - 望花区
    - 顺城区
    - 抚顺县
    - 新宾满族自治县
    - 清原满族自治县
  - 本溪市:
    - 平山区
    - 溪湖区
    - 明山区
    - 南芬区
    - 本溪满族自治县
    - 桓仁满族自治县
  - 丹东市:
    - 元宝区
    - 振兴区
    - 振安区
    - 宽甸满族自治县
    - 东港市
    - 凤城市
  - 锦州市:
    - 古塔区
    - 凌河区
    - 太和区
    - 黑山县
    - 义 县
    - 凌海市
    - 北镇市*
  - 营口市:
    - 站前区
    - 西市区
    - 鲅鱼圈区
    - 老边区
    - 盖州市
    - 大石桥市
  - 阜新市:
    - 海州区
    - 新邱区
    - 太平区
    - 清河门区
    - 细河区
    - 阜新蒙古族自治县
    - 彰武县
  - 辽阳市:
    - 白塔区
    - 文圣区
    - 宏伟区
    - 弓长岭区
    - 太子河区
    - 辽阳县
    - 灯塔市
  - 盘锦市:
    - 双台子区
    - 兴隆台区
    - 大洼县
    - 盘山县
  - 铁岭市:
    - 银州区
    - 清河区
    - 铁岭县
    - 西丰县
    - 昌图县
    - 调兵山市
    - 开原市
    - 朝阳市
    - 市辖区
    - 双塔区
    - 龙城区
  - 朝阳县:
    - 建平县
    - 喀喇沁左翼蒙古族自治县
    - 北票市
    - 凌源市
  - 葫芦岛市:
    - 连山区
    - 龙港区
    - 南票区
    - 绥中县
    - 建昌县
    - 兴城市
吉林省:
  - 长春市:
    - 南关区
    - 宽城区
    - 朝阳区
    - 二道区
    - 绿园区
    - 双阳区
    - 农安县
    - 九台市
    - 榆树市
    - 德惠市

3、测试结果

-------------------------------------------------
     1 辽宁省
     2 钓鱼岛
     3 北京市
     4 天津市
     5 吉林省
     6 河北省
     7 台湾
     8 内蒙古自治区
     9 山西省
     10 香港
     11 澳门
输入q退出系统
输入b返回上一级菜单
请输入对应的名称进入下级菜单:台湾
-------------------------------------------------
     1 台湾
输入q退出系统
输入b返回上一级菜单
请输入对应的名称进入下级菜单:b
-------------------------------------------------
     1 辽宁省
     2 钓鱼岛
     3 北京市
     4 天津市
     5 吉林省
     6 河北省
     7 台湾
     8 内蒙古自治区
     9 山西省
     10 香港
     11 澳门
输入q退出系统
输入b返回上一级菜单
请输入对应的名称进入下级菜单:北京市
-------------------------------------------------
     1 市辖区
     2 东城区
     3 西城区
     4 崇文区
     5 宣武区
     6 朝阳区
     7 丰台区
     8 石景山区
     9 海淀区
     10 门头沟区
     11 房山区
     12 通州区
     13 顺义区
     14 昌平区
     15 大兴区
     16 怀柔区
     17 平谷区
     18 密云县
     19 延庆县
输入q退出系统
输入b返回上一级菜单
请输入对应的名称进入下级菜单:b
-------------------------------------------------
     1 辽宁省
     2 钓鱼岛
     3 北京市
     4 天津市
     5 吉林省
     6 河北省
     7 台湾
     8 内蒙古自治区
     9 山西省
     10 香港
     11 澳门
输入q退出系统
输入b返回上一级菜单
请输入对应的名称进入下级菜单:山西省
-------------------------------------------------
     1 太原市
     2 大同市
     3 阳泉市
     4 长治市
     5 晋城市
     6 晋中市
     7 运城市
     8 忻州市
     9 临汾市
     10 吕梁市
输入q退出系统
输入b返回上一级菜单
请输入对应的名称进入下级菜单:太原市
-------------------------------------------------
     1 小店区
     2 迎泽区
     3 杏花岭区
     4 尖草坪区
     5 万柏林区
     6 晋源区
     7 清徐县
     8 阳曲县
     9 娄烦县
     10 古交市
输入q退出系统
输入b返回上一级菜单
请输入对应的名称进入下级菜单:b
-------------------------------------------------
     1 太原市
     2 大同市
     3 阳泉市
     4 长治市
     5 晋城市
     6 晋中市
     7 运城市
     8 忻州市
     9 临汾市
     10 吕梁市
输入q退出系统
输入b返回上一级菜单
请输入对应的名称进入下级菜单:q
感谢使用查询系统

Result
posted @ 2023-06-16 18:40  evescn  阅读(31)  评论(0编辑  收藏  举报