美文网首页
10 | 多级菜单演变过程

10 | 多级菜单演变过程

作者: 运维开发_西瓜甜 | 来源:发表于2019-12-27 18:59 被阅读0次

    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)
    

    相关文章

      网友评论

          本文标题:10 | 多级菜单演变过程

          本文链接:https://www.haomeiwen.com/subject/igqpnctx.html