Исходный код EJIO.ctk_extender.windows.popup.confirm

## /ctk_extender/windows/popup/confirm.py

import customtkinter as ctk
from collections.abc import Callable
from typing import Any
from .base import BasePopup
from ...widget import Label, PackStrategy
from EJIO.utils import _

__all__ = ['ConfirmPopup']

[документация] class ConfirmPopup(BasePopup): """Модальное окно запроса подтверждения (Да/Нет) с возвратом результата в callback.""" __slots__ = ('_message', '_callback') def __init__( self, title: str, message: str, on_callback: Callable[[bool], None], master: Any = None, timeout: float | None = None, ) -> None: self._message: str = message self._callback: Callable[[bool], None] | None = on_callback super().__init__(title, width=380, height=160, modal=True, master=master, timeout=timeout)
[документация] def build_content(self) -> None: self.add_widget(Label, text=self._message, geometry=PackStrategy(pady=20, padx=20, fill="x")) # Контейнер для горизонтального размещения кнопок рядом btn_frame = ctk.CTkFrame(self.container, fg_color="transparent") btn_frame.pack(side="bottom", pady=15) # Кнопка 'Да' (передает True) ctk.CTkButton( btn_frame, text=_("ctk_extender.builtins.popup.yes"), width=95, command=lambda: self._handle_choice(True) ).pack(side="left", padx=10) # Кнопка 'Нет' (передает False) ctk.CTkButton( btn_frame, text=_("ctk_extender.builtins.popup.no"), width=95, fg_color="#6B7280", hover_color="#4B5563", command=lambda: self._handle_choice(False) ).pack(side="left", padx=10)
def _handle_choice(self, choice: bool) -> None: callback = self._callback self._callback = None self.destroy() if callback is not None: try: callback(choice) except Exception: pass
[документация] def destroy(self) -> None: """Переопределенный деструктор: если окно закрыли крестиком, возвращаем False.""" if getattr(self, '_callback', None) is not None: callback = self._callback self._callback = None if callback is not None: try: callback(False) except Exception: pass super().destroy()