1 项目分析
项目成果图
顶级菜单
image.png操作过程展示
分析
在运维工作当中少不了运维工具箱,其实本质就是一些常用的脚本工具,利用逻辑结构代码讲他们整合到一起。
从上图中可以看到,这个工具箱会有多个级别。
就是说 有一级菜单,二级菜单,三级菜单等
一级菜单包含了二级菜单,二级菜单包含了三级菜单,依次类推。
如何实现?在 Python 中利用引用 ,可以很容易实现。
2 初始规划
2.1 定义菜单箱
利用列表进行嵌套来构建各个级别的菜单项
首先可以这样规划
设置示例:
[['菜单名称', '这个菜单项返回的结果',下一级菜单列表名 ]]
这个菜单项返回的结果
或者下一级菜单
,假如没有写成空字符串 ''意思就是,
这个菜单项返回的结果
和下一级菜单
在同一个菜单项中是互斥的,只能有一个
# 三级菜单示例列表
menu_third_list = [
['三级菜单第一项', "这是三级菜单第一项的内容", ''],
['三级菜单第二项', "这是三级菜单第一项的内容", ''],
]
# 三级菜单系统信息查询
menu_sys_list = [
['检查 cpu 信息', "这是 CPU 信息", ''],
['检查 memery 信息', "这是 内存 信息", ''],
['检查 disk 信息', "这是 硬盘 信息", ''],
]
# 二级菜单列表
daily_check_item = [
['系统基础信息,继续...', '', menu_sys_list ]
]
secon_menu_list = [
['二级菜单-->我有 3 级的,要看不', '', menu_third_list],
['二级级菜单-->选我直接看内容', "这是二级菜单第二项的内容", '']
]
# 用于获取当前日期
new_dt = time.strftime("%F")
# 顶级菜单
menu_list = [
[u'当前日期', new_dt, ''],
['每日检查项目信息', '', daily_check_item],
['一级菜单','',secon_menu_list]
]
3 初见成效和枚举函数的使用
# 空字典
menu_dict = {}
# 定义一个变量,把一开始的顶级菜单的赋值个 current_list
current_list = menu_list
# 存放当前列表的上一层,以便下次循环时使用
up_lay_list = []
import sys
while True:
# 循环当前层级的菜单列表,并且创建出一个菜单字典
for idx, item in enumerate(current_list, 1):
menu_dict.update({str(idx): {"title": item[0], "func": item[1], "next_menu": item[2]}})
# 循环这个菜单字典打印出当前层级的菜单名称
for _index, sub_dic in menu_dict.items():
print(_index, sub_dic['title'])
# 进入用户选择菜单项并且处理用户的选择逻辑部分
while True:
# 提示用户选择
inp = input('>>:')
# 假如直接输入回车,就跳出
if not inp: break
# 输入 q 就退出此程序
if inp == 'q':
sys.exit("系统退出")
# 输入 b 就 返回上一级菜单
if inp == 'b':
# 这里需要判断一下当前的菜单是否有上一级菜单
# 有, 从 存放上级菜单的列表中取出当前菜单的上一级菜单
# 并赋值给 存放当前层菜单的变量,应该主程序之后循环处理
# 这个变量的值,也就是 current_list, 并且清空菜单字典
#
# 没有上一级菜单就退出当前的循环,回到外层循环打印当前的菜单
if up_lay_list:
current_list = up_lay_list.pop()
menu_dict.clear()
break
# 这里是假设输入的选择 不在字典的 key 中,就返回
if inp not in menu_dict: break
# 代码运行到这里,说明用户的选择是存在于列表中的
# 这里有个两种情况:
# 1. 选择的菜单项有下一级菜单
elif menu_dict[inp]['next_menu']:
# 因为,选择了进入下一级菜单了,需要保存一下当前菜单
# 并且当前菜单会作为将要进入到下一级菜单的上一级菜单
#
up_lay_list.append(current_list)
# 获取到当前菜单的下一级菜单,并作为外部循环的菜单列表
current_list = menu_dict[inp]['next_menu']
menu_dict.clear()
# 跳出本层循环,在外层循环中创建新的菜单并且打印出来
break
# 2. 选择的菜单没有下一级菜单,但一定会有处理此菜单项的函数
elif menu_dict[inp].get('func'):
# 获取函数,注意这里先不执行,因为希望在打印函数返回值
# 之前再次打印一下当前菜单,好让用户看到接下来可以选择
# 的菜单项。
content = menu_dict[inp].get('func')
# 再次打印出当前菜单项,提高用户体验度
for k, v in menu_dict.items():
print(k, v['title'])
# 执行函数
print('-' * 20)
print()
print(content)
print()
print('-' * 20)
网友评论