File size: 2,653 Bytes
eed23a7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"""
UI控制器基类
提供UI组件的统一管理和事件处理接口
"""

from abc import ABC, abstractmethod
from typing import Any, Dict, List, Optional
import gradio as gr


class UIController(ABC):
    """UI控制器抽象基类

    定义UI组件的标准接口,包括组件创建、事件绑定和状态管理
    """

    def __init__(self, name: str):
        """初始化UI控制器

        Args:
            name: 控制器名称,用于标识和调试
        """
        self.name = name
        self.components: Dict[str, Any] = {}
        self.event_handlers: List[Dict[str, Any]] = []

    @abstractmethod
    def create_components(self) -> Dict[str, Any]:
        """创建UI组件

        Returns:
            包含所有UI组件的字典,键为组件名称,值为Gradio组件对象
        """
        pass

    @abstractmethod
    def setup_events(self) -> List[Dict[str, Any]]:
        """设置事件绑定

        Returns:
            事件绑定配置列表,每个配置包含组件、事件类型、处理函数等信息
        """
        pass

    def get_component(self, name: str) -> Optional[Any]:
        """获取指定名称的组件

        Args:
            name: 组件名称

        Returns:
            组件对象,如果不存在则返回None
        """
        return self.components.get(name)

    def initialize(self) -> None:
        """初始化控制器

        依次执行组件创建和事件设置
        """
        self.components = self.create_components()
        self.event_handlers = self.setup_events()

    def render(self) -> Any:
        """渲染UI组件

        子类可以重写此方法来自定义渲染逻辑

        Returns:
            渲染后的UI组件或容器
        """
        return self.components


class TabController(UIController):
    """Tab页面控制器基类

    专门用于管理Gradio Tab页面的控制器
    """

    def __init__(self, name: str, title: str):
        """初始化Tab控制器

        Args:
            name: 控制器名称
            title: Tab页面标题
        """
        super().__init__(name)
        self.title = title
        self.tab_container = None

    def render(self) -> gr.Tab:
        """渲染Tab页面

        Returns:
            包含所有组件的Gradio Tab对象
        """
        with gr.Tab(self.title) as self.tab_container:
            self._render_content()

        return self.tab_container

    @abstractmethod
    def _render_content(self) -> None:
        """渲染Tab页面内容

        子类需要实现此方法来定义具体的页面布局
        """
        pass