Исходный код EJIO.ctk_extender.notification.base

## /ctk_extender/notification/base_notification.py

import customtkinter as ctk
from typing import Any
from ..widget import WidgetContainer
from .flags import StyleFlags
from .err import NotificationMountError

__all__ = [
    'BaseNotification',
]


[документация] class BaseNotification(WidgetContainer): """ Базовый ООП-компонент уведомления. Строит пустую оболочку фона на основании битовой комбинации флагов StyleFlags. Центрирует вложенное содержимое, предотвращая перекрытие рамок. """ __slots__ = ('_flags', '_width', '_height', '_inner_content_area', '_fg_color', '_border_color') def __init__( self, parent: Any, flags: StyleFlags = StyleFlags.DEFAULT, width: int = 320,#300, height: int = 60,#55, fg_color: str = "#1E293B", border_color: str = "#475569", **kwargs: Any ) -> None:#TODO: прописать комментарий self._flags: StyleFlags = flags self._width: int = width self._height: int = height self._fg_color: str = fg_color self._border_color: str = border_color self._inner_content_area: ctk.CTkFrame | None = None super().__init__(parent, **kwargs) @property def width(self) -> int: return self._width @property def height(self) -> int: return self._height @property def content_area(self) -> ctk.CTkFrame: if self._inner_content_area is None: raise NotificationMountError( f"Notification {self.__class__.__name__} content area has not yet been mounted.") return self._inner_content_area
[документация] def build(self) -> ctk.CTkFrame: """Парсит побитовые флаги и собирает пустую оболочку фона.""" # Разбор маски: заливка фона. Если выставлен TRANSPARENT, принудительно делаем прозрачным bg = "transparent" if (self._flags & StyleFlags.TRANSPARENT) else self._fg_color # Разбор маски: скругление краев radius = 8 if (self._flags & StyleFlags.ROUNDED) else 0 # Разбор маски: тип и толщина рамки border_w = 0 if self._flags & StyleFlags.BORDER_THIN: border_w = 1 elif self._flags & StyleFlags.BORDER_THICK: border_w = 3 # 1. Конструируем несущую рамку фона base_card = ctk.CTkFrame( self.parent, fg_color=bg, corner_radius=radius, border_width=border_w, border_color=self._border_color, width=self._width, height=self._height ) self._ctk_instance = base_card # Запрещаем фрейму сжиматься под весом пустых дочерних контейнеров. base_card.pack_propagate(False) base_card.grid_propagate(False) # 2. Изолированная зона контента с отступами от краев рамки self._inner_content_area = ctk.CTkFrame(base_card, fg_color="transparent") self._inner_content_area.pack(fill="both", expand=True, padx=12, pady=8) # Защищаем от сжатия и внутреннюю зону self._inner_content_area.pack_propagate(False) return base_card