Исходный код 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