Python实现命令行菜单(类实现)

890 阅读2分钟

Python实现终端菜单

一、代码展示

menu.py文件下有两个类:MainMenu 和 Menu

class MainMenu:
    
    def __init__(self) -> None:
        self.current_menu = None
        self.run()
    
    def run(self):
        var_list = self.__class__.__dict__
        if "menu" not in var_list:
            err = 'No menu\n\tneed "menu = Menu()" in {} class'.format(self.__class__.__name__)
            raise NameError(err)
        self.current_menu = var_list["menu"]
        while True:
            try:
                if len(self.current_menu.children) == 0:
                    self.current_menu.func()
                    break
                self.current_menu.show_menu()
                opt = input("请输入选项(Ctrl+c或0退出,enter返回):")
                if opt == "":
                    if self.current_menu.parent is None:
                        break
                    self.current_menu = self.current_menu.parent
                elif opt == "0":
                    break
                else:
                    self.current_menu = self.current_menu.to_next(int(opt))
            except KeyboardInterrupt as e:
                break
class Menu:
    def __init__(self, title: str = "main") -> None:
        self.title = title
        self.children = []
        self.parent = None
        self.func = None

    def _set_parent(self, menu):
        self.parent = menu
    
    def add_child(self, menu):
        menu._set_parent(self)       # 设置父菜单 
        self.children.append(menu)
    
    def show_menu(self):
        print("\n======================\n")
        for i in range(len(self.children)):
            print("[%s]  %s" %((i+1),self.children[i].title))
        print("\n")

    def to_next(self,index: int):
        index = int(index) - 1
        return self.children[index]

    def do(self, func):
        self.func = func

二、用法:

MainMenu类

方法参数作用
MainMenu()-构造方法,返回一个主菜单对象
run()-启动菜单,创建对象时默认自动调用,不允许认为调用.

该方法主要被用来继承

Menu类

方法参数作用
Menu()title 类型:str 默认值 main构造方法,用来创建一个菜单选项
add_child()menu 类型: Menu 默认值:无新增该选项下的子选项
do()func 类型:Function用来为每个Menu绑定实现,使用装饰器调用(见示例)

三、使用示例

from menu import MainMenu, Menu         # 导入menu中的两个类

class TestMenu(MainMenu):               # 新建菜单类且继承主菜单

    menu = Menu()                       # 必须创建一个主menu实列,固定格式否则会报错
    
    # 创建一级菜单
    start_menu = Menu("启动服务")
    stop_menu = Menu("停止服务")
    set_key_menu = Menu("设置Key值")
    account_menu = Menu("账号管理")
    
    # 创建account_menu的二级菜单
    add_account_menu = Menu("新建账号")
    update_account_menu = Menu("修改密码")
    query_account_menu = Menu("查看账号")
    del_account_menu = Menu("删除账号")
    
    # 添加一级菜单 通过menu提供的add__child方法,绑定子菜单
    menu.add_child(start_menu)
    menu.add_child(stop_menu)
    menu.add_child(set_key_menu)
    menu.add_child(account_menu)
    
    
    # 添加二级菜单 通过menu提供的add__child方法,绑定子菜单
    account_menu.add_child(add_account_menu)
    account_menu.add_child(update_account_menu)
    account_menu.add_child(query_account_menu)
    account_menu.add_child(del_account_menu)
    
    
    # 函数绑定      # 为选择的菜单绑定要实现的方法,有子菜单的menu不用绑定
    # 启动服务调用
    @start_menu.do
    def start_func():
        print("启动服务已调用")
    
    # 停止服务调用
    @stop_menu.do
    def stop_func():
        print("启动服务已调用")
    
    # key值设置调用
    @set_key_menu.do
    def set_key_func():
        print("设置key调用")
        

    # 新增用调用
    @add_account_menu.do
    def add_account_func():
        print("新增用户调用")

    # 修改用户密码调用
    @update_account_menu.do
    def update_account_func():
        print("修改密码调用")

    # 查询用户调用
    @query_account_menu.do
    def query_account_func():
        print("查询用户调用")

    # 删除用户调用
    @del_account_menu.do
    def del_account_func():
        print("删除用户调用")

    
    if __name__ == '__main__':
        # 创建实列调用
        TestMenu()