|
""" |
|
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 |