三级菜单

这个三级菜单费了很长时间,写起来很吃力,在老师讲之前,思路都错了,使用了字典套字典然后再套字典的方式,所以获取最里层的元素就很困难,一直被困在这里。听了老师的课,按照老师的思路,主要是数据的存储结构,然后自己写了控制逻辑。本来打算放弃了,因为很多同学都看视频教程都看到后面去了,自己很着急。但是我还是坚持了下来,最终完成了这个三级菜单的功能。值得自豪一下,自己完成了,I got it。下面将我的代码附上来。

首先是func.py部分的代码:

 1 #!/usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 #Created on 2016-6-19下午9:49:56
 4 #author: Administrator
 5 
 6 #定义省份列表
 7 def get_province_list():
 8     pro_list = (
 9                 {'pid':'1','pname':'四川省'},
10                 {'pid':'2','pname':'云南省'},
11                 {'pid':'3','pname':'河北省'},
12                 {'pid':'4','pname':'山西省'},
13                 {'pid':'5','pname':'辽宁省'},
14     )
15     return pro_list
16 
17 
18 #定义城市列表函数
19 def get_city_list():
20     city_list =(
21                 ({'cid':'1-1','cname':'成都市'},{'cid':'1-2','cname':'自贡市'},{'cid':'1-3','cname':'攀枝花市'},{'cid':'1-4','cname':'泸州市'},{'cid':'1-5','cname':'德阳市'},),
22                 ({'cid':'2-1','cname':'昆明市'},{'cid':'2-2','cname':'曲靖市'},{'cid':'2-3','cname':'玉溪市'},{'cid':'2-4','cname':'保山市'},{'cid':'2-5','cname':'昭通市'},),
23                 ({'cid':'3-1','cname':'石家庄市'},{'cid':'3-2','cname':'唐山市'},{'cid':'3-3','cname':'秦皇岛市'},{'cid':'3-4','cname':'邯郸市'},{'cid':'3-5','cname':'邢台市'},),
24                 ({'cid':'4-1','cname':'太原市'},{'cid':'4-2','cname':'大同市'},{'cid':'4-3','cname':'阳泉市'},{'cid':'4-4','cname':'长治市'},{'cid':'4-5','cname':'晋城市'},{'cid':'4-6','cname':'朔州市'},),
25                 ({'cid':'5-1','cname':'沈阳市'},{'cid':'5-2','cname':'大连市'},{'cid':'5-3','cname':'鞍山市'},{'cid':'5-4','cname':'抚顺市'},{'cid':'5-5','cname':'本溪市'},),
26     )
27     return city_list
28 
29 #定义区域列表
30 def get_area_list():
31     area_list = (
32                 ({'aid':'1-1-1','aname':'市辖区'},{'aid':'1-1-2','aname':'锦江区'},{'aid':'1-1-3','aname':'青羊区'},{'aid':'1-1-4','aname':'金牛区'},{'aid':'1-1-5','aname':'武侯区'}),
33                 ({'aid':'1-2-1','aname':'市辖区'},{'aid':'1-2-2','aname':'自流井区'},{'aid':'1-2-3','aname':'贡井区'},{'aid':'1-2-4','aname':'大安区'},{'aid':'1-2-5','aname':'沿滩区'}),
34                 ({'aid':'1-3-1','aname':'市辖区'},{'aid':'1-3-2','aname':'东区'},{'aid':'1-3-3','aname':'西区'},{'aid':'1-3-4','aname':'仁和区'},{'aid':'1-3-5','aname':'米易县'},{'aid':'1-3-6','aname':'盐边县'}),
35                 ({'aid':'1-4-1','aname':'市辖区'},{'aid':'1-4-2','aname':'江阳区'},{'aid':'1-4-3','aname':'纳溪区'},{'aid':'1-4-4','aname':'龙马潭区'}),
36                 ({'aid':'1-5-1','aname':'市辖区'},{'aid':'1-5-2','aname':'旌阳区'},{'aid':'1-5-3','aname':'中江县'},{'aid':'1-5-4','aname':'罗江县'}),
37                 ({'aid':'2-1-1','aname':'市辖区'},{'aid':'2-1-2','aname':'五华区'},{'aid':'2-1-3','aname':'盘龙区'},{'aid':'2-1-4','aname':'官渡区'},{'aid':'2-1-5','aname':'西山区'}),
38                 ({'aid':'2-2-1','aname':'市辖区'},{'aid':'2-2-2','aname':'麒麟区'},{'aid':'2-2-3','aname':'马龙区'},{'aid':'2-2-4','aname':'陆良区'},{'aid':'2-2-5','aname':'师宗区'}),
39                 ({'aid':'2-3-1','aname':'市辖区'},{'aid':'2-3-2','aname':'红塔区'},{'aid':'2-3-3','aname':'江川县'},{'aid':'2-3-4','aname':'澄江县'},{'aid':'2-3-5','aname':'通海县'}),
40                 ({'aid':'2-4-1','aname':'市辖区'},{'aid':'2-4-2','aname':'隆阳区'},{'aid':'2-4-3','aname':'施甸县'},{'aid':'2-4-4','aname':'腾冲县'},{'aid':'2-4-5','aname':'龙陵县'}),
41                 ({'aid':'2-5-1','aname':'市辖区'},{'aid':'2-5-2','aname':'昭阳区'},{'aid':'2-5-3','aname':'鲁甸县'},{'aid':'2-5-4','aname':'巧家县'},{'aid':'2-5-5','aname':'盐津县'}),
42                 ({'aid':'3-1-1','aname':'市辖区'},{'aid':'3-1-2','aname':'长安区'},{'aid':'3-1-3','aname':'桥东区'},{'aid':'3-1-4','aname':'桥西区'},{'aid':'3-1-5','aname':'新华区'}),
43                 ({'aid':'3-2-1','aname':'市辖区'},{'aid':'3-2-2','aname':'路南区'},{'aid':'3-2-3','aname':'路北区'},{'aid':'3-2-4','aname':'古冶区'},{'aid':'3-2-5','aname':'开平区'}),
44                 ({'aid':'3-3-1','aname':'市辖区'},{'aid':'3-3-2','aname':'海港区'},{'aid':'3-3-3','aname':'山海关区'},{'aid':'3-3-4','aname':'北戴河区'},{'aid':'3-3-5','aname':'昌黎县'}),
45                 ({'aid':'3-4-1','aname':'市辖区'},{'aid':'3-4-2','aname':'邯山区'},{'aid':'3-4-3','aname':'丛台区'},{'aid':'3-4-4','aname':'复兴区'},{'aid':'3-4-5','aname':'邯郸县'}),
46                 ({'aid':'3-5-1','aname':'市辖区'},{'aid':'3-5-2','aname':'桥东区'},{'aid':'3-5-3','aname':'桥西区'},{'aid':'3-5-4','aname':'邢台县'},{'aid':'3-5-5','aname':'临城县'}),
47                 ({'aid':'4-1-1','aname':'市辖区'},{'aid':'4-1-2','aname':'小店区'},{'aid':'4-1-3','aname':'迎泽区'},{'aid':'4-1-4','aname':'杏花岭区'},{'aid':'4-1-5','aname':'尖草坪区'}),
48                 ({'aid':'4-2-1','aname':'市辖区'},{'aid':'4-2-2','aname':'城区'},{'aid':'4-2-3','aname':'矿区'},{'aid':'4-2-4','aname':'南郊区'},{'aid':'4-2-5','aname':'新荣区'}),
49                 ({'aid':'4-3-1','aname':'市辖区'},{'aid':'4-3-2','aname':'城区'},{'aid':'4-3-3','aname':'矿区'},{'aid':'4-3-4','aname':'郊区'},{'aid':'4-3-5','aname':'平定县'}),
50                 ({'aid':'4-4-1','aname':'市辖区'},{'aid':'4-4-2','aname':'城区'},{'aid':'4-4-3','aname':'郊区'},{'aid':'4-4-4','aname':'长治县'},{'aid':'4-4-5','aname':'襄垣县'}),
51                 ({'aid':'4-5-1','aname':'市辖区'},{'aid':'4-5-2','aname':'城区'},{'aid':'4-5-3','aname':'沁水县'},{'aid':'4-5-4','aname':'阳城县'},{'aid':'4-5-5','aname':'陵川县'}),
52                 ({'aid':'4-6-1','aname':'市辖区'},{'aid':'4-6-2','aname':'朔城区'},{'aid':'4-6-3','aname':'平鲁区'},{'aid':'4-6-4','aname':'山阴县'},{'aid':'4-6-5','aname':'应县'}),
53                 ({'aid':'5-1-1','aname':'市辖区'},{'aid':'5-1-2','aname':'和平区'},{'aid':'5-1-3','aname':'沈河区'},{'aid':'5-1-4','aname':'大东区'},{'aid':'5-1-5','aname':'皇姑区'}),
54                 ({'aid':'5-2-1','aname':'市辖区'},{'aid':'5-2-2','aname':'中山区'},{'aid':'5-2-3','aname':'西岗区'},{'aid':'5-2-4','aname':'沙河口区'},{'aid':'5-2-5','aname':'甘井子区'}),
55                 ({'aid':'5-3-1','aname':'市辖区'},{'aid':'5-3-2','aname':'铁东区'},{'aid':'5-3-3','aname':'铁西区'},{'aid':'5-3-4','aname':'立山区'},{'aid':'5-3-5','aname':'千山区'}),
56                 ({'aid':'5-4-1','aname':'市辖区'},{'aid':'5-4-2','aname':'新抚区'},{'aid':'5-4-3','aname':'东洲区'},{'aid':'5-4-4','aname':'望花区'},{'aid':'5-4-5','aname':'顺城区'}),
57                 ({'aid':'5-5-1','aname':'市辖区'},{'aid':'5-5-2','aname':'平山区'},{'aid':'5-5-3','aname':'溪湖区'},{'aid':'5-5-4','aname':'明山区'},{'aid':'5-5-5','aname':'南芬区'}),
58                  )
59     return area_list
60 
61 def show_pro():
62     pro_list = get_province_list()
63     for province in pro_list:         #province是元组中的一个字典,因此具有key和value
64         print(province['pid'],province['pname'])
65         
66 #判断选择的省份是否在已有省份中的函数
67 def is_choose_province_exsit(pid):            
68     for pro_list in get_province_list():
69         if pid == pro_list['pid']:
70             return True
71     return False
72 
73 def is_choose_city_exsit(choose_pid,choose_cid):
74     for city_list in get_city_list():
75         for city in city_list:
76             if choose_pid+'-'+ choose_cid == city['cid']:
77                 return True
78     return False
79 
80 #显示所选编号的省下对应的城市名称函数            
81 def show_city(choosed_pid):
82     for city_list in get_city_list():                 #ciyt_list为子元组
83         for city in city_list:                        #city为子元组里面的字典
84             pid,cid = city['cid'].split('-')          #通过字符串的split()方法,将数据中的cid划分为省编号pid和城市编号cid
85             if pid == choosed_pid:                    #加上判断条件,打印对应序号下的省包含的城市名称
86                 print(cid,city['cname'])
87 
88 def show_area(choose_pid,choose_cid):
89     for area_list in get_area_list():
90         for area in area_list:
91             pid,cid,aid = area['aid'].split('-')
92             if pid == choose_pid and cid == choose_cid:
93                 print(aid,area['aname'])
func.py

接着上主程序部分代码:

 1 #!/usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 #Created on 2016-6-19下午7:37:31
 4 #author: Administrator
 5 
 6 from func import *
 7 
 8 if __name__ == '__main__':
 9     pro_flag = True                       #定义一个标识,用于控制程序是否退出    
10     while pro_flag:                       #开始无限循环,判断输入,直到后面程序设置循环标识为False,退出程序
11         show_pro()
12         choose_pid = input('请输入省份编号:').strip()
13         if not choose_pid.isdigit():
14             if choose_pid == 'exit':
15                 pro_flag = False
16             else:
17                 print('输入错误,请重新输入.')
18                 continue
19         if is_choose_province_exsit(choose_pid):
20             city_flag = True
21             while city_flag:
22                 show_city(choose_pid)
23                 choose_cid = input('请输入城市编号:').strip()
24                 if not choose_cid.isdigit():       #判断用户输入是否为数字,如果不为数字,看是否为quit或者exit中的一个,根据用户输入不同,进行不同操作
25                     if choose_cid == 'quit':
26                         break
27                     elif choose_cid == 'exit':
28                         pro_flag = False
29                         break
30                     else:
31                         print('输入错误,请重新输入.')
32                         continue
33                 while is_choose_city_exsit(choose_pid,choose_cid):
34                     show_area(choose_pid, choose_cid)
35                     choose =input('返回上一级请输入"quit",直接退出请输入"exit"').strip()
36                     if choose == 'quit':
37                         break
38                     elif choose == 'exit':
39                         city_flag = False
40                         pro_flag = False
41                         break
42                     else:
43                         print('输入错误,请重新输入:')
44                 else:
45                     print('输入错误,请重新输入:')
46                     continue
47         else:
48             print('输入错误,请重新输入.')      
Menu.py

程序功能是实现了,但是与老师的代码比较起来,繁琐,不够简洁,效率肯定更加低下,还需要好好努力,多写,多看,多思考,一定会提高的。为自己加油!

原文地址:https://www.cnblogs.com/chenxiforever/p/5611970.html