Исходный код EJIO.ctk_extender.widget.components.tabview
## /ctk_extender/widget/components/tabview.py
import customtkinter as ctk
from typing import Any
from loguru import logger
from ..base import Widget
from ..container import WidgetContainer
from ..geometry import GeometryStrategy
__all__ = ['Tabview']
[документация]
class Tabview(WidgetContainer):
"""Компонент многовкладочного интерфейса (на базе ctk.CTkTabview)."""
def __init__(
self,
parent: Any,
tabs: list[str],
geometry: GeometryStrategy | None = None,
**kwargs: Any
) -> None:
self._tabs = tabs
self._kwargs = kwargs
super().__init__(parent, geometry)
[документация]
def build(self) -> ctk.CTkTabview:
tabview = ctk.CTkTabview(self.parent, **self._kwargs)
# Сразу создаем переданные вкладки в рантайме
for tab_name in self._tabs:
tabview.add(tab_name)
return tabview
[документация]
def add_widget_to_tab[W: Widget](
self,
tab_name: str,
widget_cls: type[W],
*args: Any,
**kwargs: Any
) -> W:
"""
Фабричный метод для добавления виджета на конкретную вкладку компонента Tabview.
:param tab_name: Имя вкладки.
:param widget_cls: Виджет для добавления.
:param args: Аргументы для инициализации виджета.
:param kwargs: Ключевые аргументы для инициализации виджета.
"""
try:
# Получаем внутренний фрейм конкретной вкладки Tkinter
tab_frame = getattr(self.ctk_instance, 'tab')(tab_name)
# Инстанцируем виджет, передавая фрейм вкладки как parent
new_widget = widget_cls(tab_frame, *args, **kwargs)
self._children.append(new_widget)
return new_widget
except Exception as e:
logger.error(f"Failed to add widget {widget_cls.__name__} to tab '{tab_name}': {e}")
raise