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