Skip to content

Полный переход на CTk-диалоги с поддержкой темной/светлой темы & Исправление белой темы в подсказках (тулпитах) в трей-настройках#1011

Open
Yan4ik000 wants to merge 6 commits into
Flowseal:mainfrom
Yan4ik000:main

Conversation

@Yan4ik000

@Yan4ik000 Yan4ik000 commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Добавлен новый модуль - ui/ctk_dialogs.py.

В нем все функции вызова любых по типу CTk окон, обычные сообщения - show_info, ошибки - show_error, вопросы "Да/Нет" - ask_yes_no и окно загрузки обновления с прогрессом - run_with_progress (оно теперь одно из компонентов CTk окон).

В итоге, на Windows (неважно на 11, 10 или 7 винде) это добавляет полную поддержку темной темы в программу, теперь включая темную тему, она распространится не только на основное окно трей-настроек, но и на все диалоговые окна/ошибки/предупреждения и тому подобные окна.
При этом поддержка светлой темы никуда не исчезла.

Пока что, на всякий случай, если по какой либо причине будет ошибка при отрисовке CTk сообщений, оставлен fallback на стандартные win32 уведомления/диалоги.

Также пофикшен баг, или недочет (не знаю как назвать), когда при включенной светлой теме, подсказки под параметрами в настройках оставались в темной теме.

Если хотите сами протестировать работу проги, можете скачать артефакт из actions в моем форке

Скрины:

29_IPv6_warning 27_Ошибка_занятости_порта 09_Telegram_ссылка_скопирована

(на начало в заголовках не обращайте внимания, я запрашивал уведомления напрямую через скрипт, а не получал их нормальным способом, и из-за этого писалось в начале заголовка - "dlg-X", в обычном использовании выглядит примерно так)
{6ACF8501-451F-45DE-8D66-A925FBA9242B}
{DA645F35-8F28-4749-99C1-8692090AA97D}

Исправленное окно подсказок при белой теме:

{4ACCB3AC-FD11-4D26-9138-419651A67295}

@Yan4ik000 Yan4ik000 requested a review from Flowseal as a code owner June 19, 2026 05:02
Comment thread ui/ctk_dialogs.py Outdated
Comment on lines +34 to +43
if kind == "error":
line = max(6, int(canvas * 0.13))
inset = int(canvas * 0.31)
draw.line((inset, inset, canvas - inset, canvas - inset), fill=(255, 255, 255, 255), width=line)
draw.line((canvas - inset, inset, inset, canvas - inset), fill=(255, 255, 255, 255), width=line)
else:
bbox = draw.textbbox((0, 0), text, font=font)
x = (canvas - (bbox[2] - bbox[0])) / 2 - bbox[0]
y = (canvas - (bbox[3] - bbox[1])) / 2 - bbox[1] + canvas * 0.01
draw.text((x, y), text, font=font, fill=(255, 255, 255, 255))

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Плохое решение делать kind строкой

Comment thread ui/ctk_dialogs.py Outdated
Comment on lines +53 to +57
def _appearance_is_dark(ctk: Any) -> bool:
try:
return str(ctk.get_appearance_mode()).lower() == "dark"
except Exception:
return False

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

по-моему где-то уже есть эта функция

@Yan4ik000

Copy link
Copy Markdown
Contributor Author
  1. 'kind' заменён на 'str, Enum'
  2. Относительное дублирование было, в ui/ctk_tooltip.py на 59 строчке, "if ctk.get_appearance_mode() == "Dark":"
    Я просто вынес эту логику в общую функцию "is_dark_mode" в файле ui/ctk_theme.py

@Yan4ik000 Yan4ik000 requested a review from Flowseal June 19, 2026 09:42
Comment thread windows.py Outdated
Comment on lines +211 to +219
_run_ctk_modal(lambda: ctk_run_with_progress(
ctk,
parent=None,
theme=ctk_theme_for_platform(),
title="TG WS Proxy — Обновление",
message="Устанавливается обновление...",
icon_path=ICON_PATH,
task=_do_update,
))

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Дедлок, если будет ошибка. Новому окну с ошибкой нужен будет ввод, но он будет заблокирован из-за grab_set формы с прогрессом. Форма с прогрессом будет ждать завершения perfom_update, а оно будет ждать закрытия окна ошибки. Ошибки для run_with_progress лучше показывать через set_status, как это было реализовано до.

Я бы оставил единое окно с кнопками прямо в run_with_progress, так как никаким больше образом это окно использоваться не будет, сохранив прежнюю логику полностью

Comment thread windows.py Outdated

def _run_ctk_modal(callback):
if ctk is not None and ensure_ctk_thread(ctk, _config.get("appearance", "auto")):
if threading.current_thread().name == "ctk-root":

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Магическое значение ctk-root

Comment thread ui/ctk_tray_ui.py Outdated
from utils.tray_common import ensure_ctk_thread, ctk_run_dialog

if ensure_ctk_thread(ctk, "auto"):
if threading.current_thread().name == "ctk-root":

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Магическое значение ctk-root

Лучше в tray_common сделать проверку с вынесением ctk-root в константу из этих проверок и ensure_ctk_thread

Comment thread ui/ctk_tray_ui.py Outdated
from ui.ctk_tooltip import attach_ctk_tooltip, attach_tooltip_to_widgets

log = logging.getLogger('tg-mtproto-proxy')
_APP_ICON_PATH = str(Path(__file__).resolve().parent.parent / "icon.ico")

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В windows.py уже есть ICON_PATH
Стоит унифицировать

Comment thread ui/ctk_dialogs.py Outdated
root, body, content_frame, scaling = _build_dialog_base(ctk, parent, theme, title, message, kind, icon_path)

dark = is_dark_mode(ctk)
footer_bg = "#2b2b2b" if dark else "#f3f3f3"

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Магические значения. Используйте CtkTheme

Comment thread ui/ctk_dialogs.py Outdated

if icon_path:
try:
root.after(200, lambda: root.iconbitmap(icon_path))

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделайте 300мс

Comment thread ui/ctk_dialogs.py Outdated
body_bg = "#2b2b2b" if dark else "#ffffff"
text_color = theme.text_primary

root = ctk.CTkToplevel(parent) if parent is not None else ctk.CTkToplevel()

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

эквивалентно CTkToplevel(parent)

@Yan4ik000

Copy link
Copy Markdown
Contributor Author

Исправлено

  1. Для обновления вернул логику одного окна. Ошибки теперь показываются через status label внутри run_with_progress, без открытия отдельного окна. Обновление статуса из worker-потока сделано через очередь, чтобы не трогать Tk напрямую из другого потока
  2. Вынес ctk-root в CTK_THREAD_NAME и добавил is_ctk_thread() в utils.tray_common
  3. Унифицировал путь к иконке через APP_ICON_PATH в utils.tray_common
  4. Убрал магические цвета в CTk-диалогах/tooltip, теперь используются значения из CtkTheme
  5. Заменил задержку установки iconbitmap на 300 мс
  6. Упростил создание окна до CTkToplevel(parent).

@Yan4ik000 Yan4ik000 requested a review from Flowseal June 23, 2026 13:42
@Yan4ik000

Copy link
Copy Markdown
Contributor Author

Плюсом я конфликт в windows.py исправил после мержа pr #1025, и также у меня не запускалось приложение после сборки с решенным конфликтом, из-за того что .json локализацию забыли в конфиг и pyinstaller положить, починил и это

Comment thread packaging/linux.spec Outdated
Comment on lines +29 to +32
datas=[(ctk_path, 'customtkinter/')] + gi_datas + typelib_datas,
datas=[
(ctk_path, 'customtkinter/'),
(os.path.join(os.path.dirname(SPEC), os.pardir, 'ui', 'i18n', '*.json'), 'ui/i18n'),
] + gi_datas + typelib_datas,

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не надо, исправлено в 6b5fd72

Comment thread packaging/macos.spec Outdated
Comment on lines +12 to +14
datas=[],
datas=[
(os.path.join(os.path.dirname(SPEC), os.pardir, 'ui', 'i18n', '*.json'), 'ui/i18n'),
],

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не надо, исправлено в 6b5fd72

Comment thread packaging/windows.spec Outdated
Comment on lines +16 to +19
datas=[(ctk_path, 'customtkinter/')],
datas=[
(ctk_path, 'customtkinter/'),
(os.path.join(os.path.dirname(SPEC), os.pardir, 'ui', 'i18n', '*.json'), 'ui/i18n'),
],

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не надо, исправлено в 6b5fd72

@Yan4ik000

Copy link
Copy Markdown
Contributor Author

откатил

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants