三级菜单:

1. 运行程序输出第一级菜单

2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单

3. 菜单数据保存在文件中

4. 让用户选择是否要退出

5. 有返回上一级菜单的功能

类定义:menu_class.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author : Wang Yue
#menu class
#定义菜单类,属性使用的实例属性,没有使用类属性,类属性共享给全部实例,会有问题的,这是百度才知道。
class menu_level(object):
def __init__(self,real_name,real_my_id,real_parent_id):
self.name=real_name #菜单名称
self.my_id=real_my_id #菜单id
self.parent_menu_id=real_parent_id #上级菜单id
self.child_menu=[] #子菜单实例集合
self.here = False # means hold one 用户所在位置 #以下是一系列的属性操作方法
def put_name(self,real_name):
self.name=real_name
def get_name(self):
return self.name
def put_my_id(self,real_my_id):
self.my_id=real_my_id
def get_my_id(self):
return self.my_id
def put_par_id(self,real_par_id):
self.parent_menu_id=real_par_id
def get_par_id(self):
return self.parent_menu_id
def put_here_true(self):
self.here=True
def put_here_false(self):
self.here=False
def get_here(self):
return self.here
def get_child(self):
return self.child_menu
def set_child(self,child):
self.child_menu=child
def append_child(self,menu_child):
self.child_menu.append(menu_child)

入口程序:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author : Wang Yue
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author : Wang Yue #主函数:进行各种业务的入口
#导入具体各个方法逻辑的文件,和sys库
import menu_fuc,sys #运行时,需要知道运行方式。
if __name__ == "__main__":
menu=menu_fuc.init_menu() #类初始化实例
p_menu=menu_fuc.init_child(menu,0) #整理菜单,0为根,弄成一个菜单列表,有层级的,列表中的元素是最上的根。 print(">>{_name}".format(_name=p_menu[0].get_name())) #按照需求,运行程序就打印根路径名称
while True:
#用循环维持整体操作环境
#提供以下命令:
#1、view,显示当前所在位置的路径,就是面包屑
#2、next 菜单名称,到相应的菜单去
#3、back,返回上一级菜单
#4、tree,列出完整的菜单树
#5、quit,退出程序
# cmd is "view |next #name|back|tree|quit" view:where am i | next #name:where are you go | back:back to sup menu| tree list all menu|quit is exit
cmd=input("MENU CMD:")
if cmd =="view":
name_que=menu_fuc.view_menu(menu) #列出当前所在完整路径,面包屑
last_name=name_que[-2]
for name in name_que:
print("{_name}".format(_name=name),end=">>>")
if name==last_name:
print(name_que[-1])
break
elif "next" in cmd:
cmd_go=cmd.split() #进入某一级菜单,根据菜单名称,不仅仅是下级。随意切换
name=cmd_go[1]
menu_fuc.next_menus(name,menu) #按照需求,当进入某一级后,要列出下级所有菜单名称
menu_fuc.next_menu(menu,name) #进入下级的执行代码的方法函数
elif cmd=="back":
menu_fuc.back_menu(menu) #返回上级的方法函数
elif cmd == "tree":
menu_fuc.tree_menu(p_menu,">>") #列出完整菜单树的方法函数
elif cmd == "quit" :
sys.exit(0)
else:
cmd_help='''
my menu CMD:
view:where am i(view Current path)
next #name:where are you go (go to #name menu)
back:back to parent menu
tree:list all tree
quit:exit menu
提供以下命令:
1、view,显示当前所在位置的路径,就是面包屑
2、next 菜单名称,到相应的菜单去
3、back,返回上一级菜单
4、tree,列出完整的菜单树
5、quit,退出程序
''' print(cmd_help)

业务程序处理:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author : Wang Yue
import menu_class,re
#初始化用户菜单的各个实例
def init_menu():
menu_list=[]
with open("menu_db.doo",mode="r",encoding="utf-8") as menu_db:
menu_db.flush()
menu_db.seek(0)
lines=menu_db.readlines()
for line_m in lines:
line_f=line_m.strip()
line=re.split(',',line_f)
menu_cl=menu_class.menu_level(line[1],int(line[0]),int(line[2]))
menu_list.append(menu_cl)
return menu_list #将子节点集合存入相应的父菜单实例的child列表中
def init_child(menu_list,pid):
p_menu=[]
for menu_one in menu_list:
# print("my id is:{_name}".format(_name=menu_one.get_my_id()))
if menu_one.get_par_id() == pid:
p_menu.append(menu_one)
for ppp in p_menu:
get_sub_node(menu_list,ppp)
return p_menu
def get_sub_node(menu_list,p_node): #上一个方法中,会调用此方法,寻找下级的子节点,利用递归一层一层查找
for menu_child in menu_list:
if p_node.get_my_id() == menu_child.get_par_id():
# print(menu_child.get_name())
p_node.append_child(menu_child)
get_sub_node(menu_list,menu_child) def get_back_menu(menu,menu_here,menu_que): #返回上级路径的方法
for menu_one in menu:
if menu_here.get_par_id() == menu_one.get_my_id():
menu_que.append(menu_one)
if menu_one.get_par_id() != 0:
get_back_menu(menu,menu_one,menu_que)
return menu_que def view_menu(menu): #查看当前所在路径。
menu_name_que=[]
temp_que=[]
menu_que=[]
for menu_one in menu:
if menu_one.get_here():#find which menu
menu_que=get_back_menu(menu,menu_one,temp_que)
menu_que.insert(0,menu_one)
break
menu_que.reverse()
for my_menu in menu_que:
menu_name_que.append(my_menu.get_name())
return menu_name_que def next_menu(menu,name): #进入下一级路径。
for menu_one in menu:
if menu_one.get_name()==name:
menu_one.put_here_true()
menu_next=menu_one
elif menu_one.get_here():
menu_one.put_here_false() def back_menu(menu): #返回上级菜单
for menu_one in menu:
if menu_one.get_here():
menu_one.put_here_false()
for menu_two in menu:
if menu_two.get_my_id() == menu_one.get_par_id():
menu_two.put_here_true(); def tree_menu(menu,logo): #显示完整菜单树,也是递归方法
m=logo
# root = tree_assembly(menu, p_id)
for menu_root in menu:
print(m+menu_root.get_name())
if len(menu_root.get_child()) > 0:
tree_menu(menu_root.get_child(),logo+m) def next_menus(now_menu_name,menu): #在进入下级菜单时,显示下级全部菜单。
for which_menu in menu:
if which_menu.get_name() == now_menu_name:
now_menu=which_menu
ne_menu = now_menu.get_child()
for ne_one in ne_menu:
print(">>>{_name}".format(_name=ne_one.get_name()))

附:数据文件:

1,中国,0
2,河北,1
3,安徽,1
4,黑龙江,1
5,辽宁,1
6,山东,1
7,内蒙古,1
8,石家庄,2
9,济南,6
10,青岛,6
11,呼伦贝尔,7
12,锡林郭勒,7
13,二连浩特,7
14,海加尔,7
15,承德,2
16,合肥,3
17,哈尔滨,4
18,吉林,5
19,长春,5
20,临沂,6

python3.x Day1 菜单程序练习的更多相关文章

  1. python学习(10)字典学习,写一个三级菜单程序

    学习了字典的应用.按老师的要求写一个三级菜单程序. 三级菜单程序需求如下: 1.深圳市的区--街道--社区---小区4级 2.建立一个字典,把各级区域都装进字典里 3.用户可以从1级进入2级再进入3级 ...

  2. Python3学习之路~2.5 简单的三级菜单程序

    程序:三级菜单 需求: 1.打印省.市.县三级菜单2.可返回上一级3.可随时退出程序 代码1: data={ "山东":{ "济南":["历下区&qu ...

  3. python3.x Day1 用户登录程序练习

    训练1: 模拟登陆: 1. 用户输入帐号密码进行登陆 2. 用户信息保存在文件内 3. 用户密码输入错误三次后锁定用户 login2.py: #!/usr/bin/env python # -*- c ...

  4. C实现dos图文菜单程序实例

      前言 公司一台服务器是novell环境,文件管理是基于dos6.22的,客户端启动需要一个图文菜单.   实现    编程环境:汉化版TC2.0 菜单基本功能:显示提示项.显示dbf中的行情信息. ...

  5. python3 第三章 - 程序的基本结构

    1.编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -* ...

  6. python3 练习题(多级菜单)

    '''多级菜单需求:1.现有省/市/县3级结构,要求程序启动后,允许用户可依次选择进入各子菜单2.可在任意一级菜单返回上一级3.可以在任意一级菜单退出程序所需新知识点: 列表/字典'''menu = ...

  7. VC++创建快捷方式、删除快捷方式、添加开始菜单程序组菜单并删除程序组菜单的实例

    转载:http://www.codefans.net/articles/1435.shtml 转载:http://www.cnblogs.com/morewindows/archive/2011/08 ...

  8. Python3.6写socket程序

    Python进行Socket程序编写使用的主要模块就是 socket 模块,在这个模块中可以找到 socket()函数,该函数用于创建套接字对象.套接字也有自己的方法集,这些方法可以实现基于套接字的网 ...

  9. python3实现邮件发送程序

    刚开始的想法很简单,由于有上千封的邮件需要发出去,并且需要一条一条发送,不能转发或群发,每条邮件要署对方的姓名,并加上几个相同的符件,考虑到手工操作繁琐无趣,所以想到用程序实现,python好像非常胜 ...

随机推荐

  1. U74201 旅行计划 树上找链长度

    题目背景 珂朵莉放假了,她打算去唐山旅行. 题目描述 我们简单地把唐山的共 nn 个景点看成是一棵树,有 n-1n−1 条边将它们连接起来,每个景点有一个游览指数 v_ivi​.珂朵莉的假期时间不长, ...

  2. emma中文显示乱码问题解决(ubutnu)

    vim -/.emma/emmarc 找到  db_encoding=latin1 改为  db_encoding=utf8  然后重新运行emma,此时发现还是乱码,不要着急,在执行所有的sql语句 ...

  3. 05_锅炉压力案例_java实现

    最开始是有机顶盒,后来电视里面都带着一个安卓的设备.现在空调.冰箱.洗衣机都跃跃欲试地想把这个东西加上.海尔出了一款智能冰箱,就是在冰箱门上嵌了一个12寸的屏幕.这个屏幕实际上就是一个安卓的平板似的. ...

  4. c++ memset函数

    函数名称:memset 函数所需头文件:#include<cstring> 函数作用:内存赋值函数,用来给某一块内存空间进行赋值的. 函数结构:memset(变量,一个数字,一个数字)  ...

  5. 制作并发布个人CocoaPods库

    随着对 CocoaPods 越来越多的依赖,我们也可以尝试把自己的库发布到它上面. 1.在Github上新建一个项目(名字我随便取了一个,其他步骤截图为WCUIKit).自己做相应修改即可. 2.克隆 ...

  6. webservice 权限控制

    webservice 如何限制访问,权限控制?1.服务器端总是要input消息必须携带用户名.密码信息 如果不用cxf框架,SOAP消息(xml片段)的生成.解析都是有程序员负责 2.拦截器 为了让程 ...

  7. 图片预览------photoswipe 使用

    photoswipe 使用 预览图片后,需要点击关闭按钮才能关闭,点击图片事件效果是放大图片,和微信的效果不一致,最后改用微信预览图片的接口了,但是例子可以用,记录一下!! http://www.cn ...

  8. JS 封装插件

    媒体播放器插件: mediaelement-and-player.js 轮播图插件: swiper.min.js

  9. Android 性能优化(23)*性能工具之「Heap Viewer, Memory Monitor, Allocation Tracker」Memory Profilers

    Memory Profilers In this document Memory Monitor Heap Viewer Allocation Tracker You should also read ...

  10. NHibernate3.2学习笔记

    一.开发环境 数据库:SQLServer2008 编译器:VS2010 .Net版本:.Net Framework 4.0 二.涉及第三方程序集 NHibernate.dll:版本3.2 Iesi.C ...