Home > Backend Development > Python Tutorial > How to write a multi-level menu?

How to write a multi-level menu?

零下一度
Release: 2017-07-27 15:38:16
Original
1935 people have browsed it

Requirements: Write a multi-level menu

1. Three-level menu

2. Each submenu can be entered in sequence

3.The menu can Return to the previous level

4. Use knowledge points: dictionary, list, multi-layer loop, function


1) Writing ideas

For writing ideas, refer to the flow chart in the GitHub link below

Job/Day1_Job_Multi-level menu flow chart.png


2 ) Specific implementation

 1 # -*- coding:utf-8 -*-  2   3 
 # Author:Chuixin Zeng  4   5 
 # 使用字典保存省份、市、县列表  6 
 # 这是一个多级的字典,可以通过for查询每一个级别的信息,级别:省份、市、区  7   8 
 _country_dict = {  9     '1.河南省': { 10         '1.郑州市': {'1.金水区': ['区号100', '邮编400000'], '2.中原区': ['区号101', '邮编400001'], '3.二七区': ['区号102', '邮编400002']}, 11         '2.洛阳市': {'1.老城区': ['区号200', '邮编200000'], '2.洛龙区': ['区号201', '邮编200001'], 
 '3.西工区': ['区号203', '邮编200002']}, 12         
 '3.信阳市': {'1.浉河区': ['区号300', '邮编300000'],
  '2.平桥区': ['区号301', '邮编300001'], '3.固始区': ['区号203', '邮编200002']} 13     }, 14     
  '2.河北省': { 15         '1.石家庄市': {'1.长安区': ['区号400', '邮编500000'], 
  '2.新华区': ['区号401', '邮编500001'], '3.桥西区': ['区号402', '邮编500002']}, 16         
  '2.保定市': {'1.竞秀区': ['区号500', '邮编600000'], '2.莲池区': ['区号501', '邮编600001'], 
  '3.满城区': ['区号503', '邮编600002']}, 17         '3.邯郸市': {'1.丛台区': ['区号600', '邮编700000'], '2.邯山区': ['区号601', '邮编700001'], '3.复兴区': ['区号602', '邮编700002']} 18     }, 19     '3.湖南省': { 20         '1.长沙市': {'1.芙蓉区': ['区号700', '邮编800000'], '2.岳麓区': ['区号701', '邮编800001'], '3.雨花区': ['区号702', '邮编800002']}, 21         '2.常德市': {'1.武陵区': ['区号800', '邮编900000'], '2.鼎城区': ['区号801', '邮编900001'], '3.未知区': ['区号803', '邮编900002']}, 22         '3.湘潭市': {'1.丛台区': ['区号900', '邮编110000'], '2.邯山区': ['区号901', '邮编110001'], '3.复兴区': ['区号902', '邮编110002']} 23     }, 24     '4.湖北省': { 25         '1.武汉市': {'1.江岸区': ['区号110', '邮编810000'], '2.江汉区': ['区号111', '邮编810001'], '3.汉阳区': ['区号112', '邮编810002']}, 26         '2.宜昌市': {'1.西陵区': ['区号120', '邮编910000'], '2.点军区': ['区号121', '邮编910001'], '3.夷陵区': ['区号123', '邮编910002']}, 27         '3.孝感市': {'1.孝南区': ['区号130', '邮编120000'], '2.孝感区': ['区号131', '邮编120001'], '3.未知区': ['区号132', '邮编120002']} 28     } 29 } 30  31  32 # 定义一个函数,用于将查询到的省份信息传递给此函数 33  34 def district(): 35     while True: 36         # 定义一个空列表,用于保存城市信息 37         cy = [] 38         # %s是处理对象的一种方法,是占位符,它的值来源于后面的% province省份的值,然后通过print打印出来 39         # province的值是在查询身份的语句里面定义的 40         print('%s 有以下城市:' % province) 41         # 通过for循环将用户选择的省份下面的城市列表放到_city中 42         for _city in sorted(_country_dict[province].keys()): 43             # 打印用户选择的省份下面的城市的列表 44             print(_city) 45             # 将用户选择的省份下面的城市列表附加保存到cy列表中 46             cy.append(_city) 47         # print(cy) 48         # 提供交互式界面,让用户输入要查询的城市编号 49         _city_number = input('请输入要查询的城市编号:(后退:b 退出:q)') 50         # 打印城市和区县列表的分隔符 51         print('---------------------------------------------------') 52         # 如果用户输入的编号是q,则退出查询 53         if _city_number == 'q': 54             print('已退出查询!') 55             exit() 56        
   # 如果用户输入的是b,则中断当前的判断,退回到上一级省份目录 57         elif _city_number == 'b': 58             break 59         else: 60             # 如果用户输入的是正确的编号,则从cy城市列表中获取到城市信息,放到city中 61             for city in cy: 62                 # 判断用户输入的城市编号和cy列表中的城市编号是否匹配 63                 if _city_number in city: 64                     # 如果匹配,则将当前城市的名称保存到_citynumber变量中 65                     _citynumber = city 66                     # %s是处理对象的一种方法,是占位符,它的值来源于% _citynumber具体城市的值,然后通过print打印出来 67                     print('%s 该城市有下列区县:' % _citynumber) 68  69                     # 通过while循环,将具体城市下面的区县信息查出来 70                     while True: 71                         # 用于保存区县信息的列表 72                         n = [] 73                         # 通过for循环将用户选择的城市下面的区县列表放到_districts中 74                         for _districts in sorted(_country_dict[province][_citynumber].keys()): 75                             # 打印区县的名称信息,例如二七区 76                             print(_districts) 77                             # 将区县信息保存到n列表中 78                             n.append(_districts) 79                         # 提供交互式界面,让用户输入区县的查询行为 80                         _phone_number = input('请输入要查询的区县的编号:(后退:b 退出:q)') 81                         # # 打印区县和区县具体信息列表的分隔符 82                         print('---------------------------------------------------') 83                         # 如果用户输入了q,则结束查询 84                         if _phone_number == 'q': 85                             print('已结束查询!') 86                             exit() 87                         # 如果用户输入了b,则返回到上一级查询 88                         elif _phone_number == 'b': 89                             break  # 跳出当前循环,回到上一级循环 90                        
    else: 91                             # 通过循环遍历从区县列表n中读取区县信息到pn中 92                             for pn in n: 93                                 # 如果用户输入的区县编号和pn中的区县编号匹配 94                                 if _phone_number in pn: 95                                     # 则将具体匹配到的区县的名称保存到phone_number中 96                                     phone_number = pn 97                                     # %s的值来源于% _phone_number具体区县的值,然后通过print打印出来 98                                     print('%s 的信息如下:' % phone_number) 99                                     # 通过for循环将用户选择的具体的区县的列表中的信息放到p中100                                     for p in _country_dict[province][_citynumber][phone_number]:101                                         # 打印具体区县下面的邮政编码和区号信息102                                         print(p)103                                     # 打印查询分隔符104                                     print('---------------------------------------------------')105                                     # 通过交互式界面询问用户,是否继续查询106                                     _end_get = input('查询已完成,是否继续其他查询?(继续:Y 其他:结束)')107                                     # 如果用户输入的是大写的Y,则返回到上一级继续查询108                                     if _end_get == 'Y':109                                         break110                                     # 如果用户输入除了大写Y以外其他的值,则结束查询111                                     else:112                                         print('已结束查询!')113                                         exit()114                             # 如果用户输入的区县编号有误,提示用户重新输入115                             else:116                                 print('区县编号输入错误,请重新输入')117                     
    # 第三个while True循环的退出118                     
    break119     # 如果用户输入的城市编号不对,则提示用户重新输入120     
    else:121         print('城市编号输入有误,请重新输入!')122    
     # 第二个while True不设置中断条件,用户可以退回到当前的城市查询列表中123 124 while True:125 126     
     # 初始化空列表,用于保存省份信息127     c = []128     
     # 从国家字典中取第一级列表每一行的值,循环放到_country中129    
      for _country in sorted(_country_dict.keys()):130        
       # 逐行输出国家字典里第一级列表每一行的值131         print (_country)132         '''133         打印效果134         1.河南省135         2.河北省136         3.湖南省137         4.湖北省138     '''139         # 将取到的第一级列表每一行的值追加放入c列表中140         c.append(_country)141     # print(c) # c列表打印的结果['1.河南省', '2.河北省', '3.湖南省', '4.湖北省']142     # 提供交互式界面给用户输入省份编号信息143     country_number = input("请输入要查询的省份编号:(退出:q)")144     # 打印省份和城市分割线145     print('---------------------------------------------------')146     # 如果用户输入的是q,则退出查询147     if country_number == 'q':148         print('已退出查询!')149         break150 151     # 如果没有输入q,则有两种情况:1)查询到身份列表,则把省份信息传递给district()函数做进一步查询;2)提示用户输入的编号有错误152     else:153         # 遍历c列表中的省份信息,保存到country中154         for country in c:155             if country_number in country:156                 # 将遍历到的C列表的省份信息同用户输入的省份编号进行对比157                 # 如果输入的编号和省份编号一致,则把country的值赋予给province,从而方便进一步查询特定省份下面的城市列表158                 province = country159                 # 如果符合上面的条件,则开始执行函数,此函数的目的是在现有查询的基础上进一步查询城市和区县信息160                 district()161                 # print(country_number) # 测试用户交互式输入信息162                 break163         else:164             print("您输入的省份编号有误,请重新输入!")165 # 第一个while True不设置中断条件,用户可以退回到当前的身份查询列表中
Copy after login

3) Github notes

The address of the first day’s notes is:

Exercise with the class

The address of the first day’s assignment is:

Assignment


4) Readme.md document

Assignment/ Readme_Multi-level menu.md


The above is the detailed content of How to write a multi-level menu?. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template