Исходный код EJIO.ctk_extender.components.section

## /ctk_extender/components/section.py

import customtkinter as ctk
from typing import Any
from ..widget import WidgetContainer, PackStrategy

__all__ = [
    'Section',
]


[документация] class Section(WidgetContainer): """ Графическая секция: крупный заголовок по левому краю + прокручиваемый контейнер. Метод add_widget прозрачно проксирует добавление элементов прямо внутрь скролл-зоны. """ __slots__ = ('_title_text', '_scroll_frame') def __init__(self, parent: Any, title_text: str, geometry: Any = None, **kwargs: Any) -> None: self._title_text: str = title_text self._scroll_frame: ctk.CTkScrollableFrame | None = None super().__init__(parent, geometry, **kwargs)
[документация] def build(self) -> ctk.CTkFrame: """Строит каркас секции.""" # Базовый несущий контейнер всей секции base_frame = ctk.CTkFrame(self.parent, fg_color="transparent") # 1. Создаем заголовок увеличенного шрифта по левому краю title_label = ctk.CTkLabel( base_frame, text=self._title_text, font=("Arial", 18, "bold"), anchor="w" ) title_label.pack(side="top", fill="x", pady=(5, 10)) # 2. Создаем внутренний прокручиваемый фрейм self._scroll_frame = ctk.CTkScrollableFrame(base_frame, fg_color="transparent") self._scroll_frame.pack(side="top", fill="both", expand=True) return base_frame
[документация] def add_widget[W](self, widget_cls: type[W], *args: Any, **kwargs: Any) -> W: """Переопределенный метод: направляет виджеты строго внутрь скролл-зоны.""" if self._scroll_frame is None: raise RuntimeError("Attempt to add widget to uninitialized section.") # Инстанцируем виджет, передавая ему scroll_frame в качестве физического master-родителя widget_instance = widget_cls(self._scroll_frame, *args, **kwargs) # Сохраняем ссылку в системный список WidgetContainer для защиты от Garbage Collector self._children.append(widget_instance) return widget_instance
[документация] def destroy(self) -> None: self._scroll_frame = None super().destroy()