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
class TestMenu(MainMenu):
menu = Menu()
start_menu = Menu("启动服务")
stop_menu = Menu("停止服务")
set_key_menu = Menu("设置Key值")
account_menu = Menu("账号管理")
add_account_menu = Menu("新建账号")
update_account_menu = Menu("修改密码")
query_account_menu = Menu("查看账号")
del_account_menu = Menu("删除账号")
menu.add_child(start_menu)
menu.add_child(stop_menu)
menu.add_child(set_key_menu)
menu.add_child(account_menu)
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)
@start_menu.do
def start_func():
print("启动服务已调用")
@stop_menu.do
def stop_func():
print("启动服务已调用")
@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()