Skip to content

菜单组件

Leslie Van edited this page Apr 24, 2023 · 3 revisions

主要由四个类组成,分别是:

  • 接口类 MenuComponent
  • 主菜单 Menu
  • 子菜单 SubMenu
  • 菜单项 MenuItem
classDiagram
    class MenuComponent {
        +__init__()
        +add(component)
        +get_parent()
        +set_parent(component)
        +remove(component)
        +display()
        +display_item()
        +is_leaf()
    }

    class Menu {
        +__init__(name)
        +get_parent()
        +set_parent(component)
        +add(component)
        +remove(component)
        +display()
        -name: str
        -components: list
    }

    class SubMenu {
        +__init__(name)
        +get_parent()
        +set_parent(component)
        +add(component)
        +remove(component)
        +set_value_getter(config, getter)
        +get_value()
        +set_compare_method(method)
        +check_active()
        +get_active_item()
        +display()
        -name: str
        -components: list
        -source: Any
        -getter: callable
        -is_active: int | None
        -compare_method: callable
    }

    class MenuItem {
        +__init__(name)
        +get_active_item()
        +add(component)
        +get_value()
        +remove(component)
        +display()
        +set_procedure(procedure, \*\*kwargs)
        +run()
        +is_leaf()
        -_name: str
        -_procedure: callable
        -_procedure_args: dict|None
        -_value: str|None
    }

    MenuComponent <|-- Menu
    MenuComponent <|-- SubMenu
    MenuComponent <|-- MenuItem
Loading

接口类 MenuComponent

classDiagram
    class MenuComponent {
        +__init__()
        +get_parent()
        +set_parent(component)
        +add(component)
        +remove(component)
        +display()
        +display_item()
        +is_leaf()
    }
Loading

它是一个基类,提供了基础的接口,用于定义菜单组件的行为。该类声明了一些方法,包括添加、获取和移除子项、设置和获取父项、显示菜单、显示菜单条目、判断是否为叶子节点等。

主菜单 Menu

classDiagram

class Menu {
        +__init__(name)
        +get_parent()
        +set_parent(component)
        +add(component)
        +remove(component)
        +display()
        -name: str
        -components: list
    }
Loading

Menu 类是一个具体的菜单组件类,继承自 MenuComponent 类,表示主菜单。该类具有添加、移除和显示子菜单、显示菜单等基本行为。其中,add 方法用于添加子菜单组件,remove 方法用于移除子菜单组件,display 方法用于打印子菜单条目。

子菜单 SubMenu

classDiagram

class SubMenu {
        +__init__(name)
        +get_parent()
        +set_parent(component)
        +add(component)
        +remove(component)
        +set_value_getter(config, getter)
        +get_value()
        +set_compare_method(method)
        +check_active()
        +get_active_item()
        +display()
        -name: str
        -components: list
        -source: Any
        -getter: callable
        -is_active: int | None
        -compare_method: callable
    }

Loading

SubMenu 类是一个具体的菜单组件类,继承自 MenuComponent 类,表示子菜单。该类具有添加、移除和显示菜单项、设置和获取子菜单当前值、检查并更新当前选中项等基本行为。其中,addremove 方法用于添加或移除菜单项,display 方法用于打印完整的子菜单选项。同时,该类还提供若干个具体的处理方法,用于获取或更新子菜单当前值,判断当前选中项等。

菜单项 MenuItem

classDiagram
class MenuItem {
        +__init__(name)
        +get_active_item()
        +add(component)
        +get_value()
        +remove(component)
        +display()
        +set_procedure(procedure, \*\*kwargs)
        +run()
        +is_leaf()
        -_name: str
        -_procedure: callable
        -_procedure_args: dict|None
        -_value: str|None
    }

Loading

MenuItem 类是一个具体的菜单组件类,继承自 MenuComponent 类,表示菜单项。该类主要有设置和获取菜单项信息、获取菜单项值、执行菜单项的处理方法等基本行为。其中,set_procedure 方法用于设置菜单项的处理方法,run 方法用于执行菜单项的处理方法。同时,该类还实现了 is_leaf 方法,用于判断是否为叶子节点。


下面是一个简单的菜单示例,演示了如何创建一个简单的菜单,包含一个主菜单和一个子菜单,子菜单下有两个菜单项。通过注释可以清晰地了解每一步的作用和意义。

# 创建一个主菜单,名称为“当前设置”,空格用于缩进,使其在菜单中居中显示。
root_menu = Menu('    当前设置')

# 在主菜单中创建一个名为“logo”的子菜单
logo_menu = SubMenu('logo')
# 两个参数结合,表示读取 config['logo']['enable'] 作为子菜单当前选中的值
logo_menu.set_value_getter(config, lambda x: x['logo']['enable'])
# 设置子菜单当前选中的值和菜单项的值的比较方法
logo_menu.set_compare_method(lambda x, y: x == y)
root_menu.add(logo_menu)	# 将子菜单添加到主菜单中

# 在子菜单中创建名为“启用”的菜单项,值为 True,并设置其对应的处理方法。
logo_enable_menu = MenuItem('启用')
logo_enable_menu._value = True	# 用于和子菜单当前选中的值进行比较,如果相等则表示选中启用
logo_enable_menu.set_procedure(config.enable_logo)	# 修改配置文件,启用 logo
logo_menu.add(logo_enable_menu)	# 将菜单项添加到子菜单中

# 在子菜单中创建名为“不启用”的菜单项,值为 False,并设置其对应的处理方法。
logo_disable_menu = MenuItem('不启用')
logo_disable_menu._value = False	# 用于和子菜单当前选中的值进行比较,如果相等则表示选中不启用
logo_disable_menu.set_procedure(config.disable_logo)	# 修改配置文件,禁用 logo
logo_menu.add(logo_disable_menu)	# 将菜单项添加到子菜单中

菜单组件在 init.py 中被实例化,菜单组件的定义在 entity/menu.py

Clone this wiki locally