Полный переход на CTk-диалоги с поддержкой темной/светлой темы & Исправление белой темы в подсказках (тулпитах) в трей-настройках#1011
Conversation
| 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)) |
There was a problem hiding this comment.
Плохое решение делать kind строкой
| def _appearance_is_dark(ctk: Any) -> bool: | ||
| try: | ||
| return str(ctk.get_appearance_mode()).lower() == "dark" | ||
| except Exception: | ||
| return False |
There was a problem hiding this comment.
по-моему где-то уже есть эта функция
|
| _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, | ||
| )) |
There was a problem hiding this comment.
Дедлок, если будет ошибка. Новому окну с ошибкой нужен будет ввод, но он будет заблокирован из-за grab_set формы с прогрессом. Форма с прогрессом будет ждать завершения perfom_update, а оно будет ждать закрытия окна ошибки. Ошибки для run_with_progress лучше показывать через set_status, как это было реализовано до.
Я бы оставил единое окно с кнопками прямо в run_with_progress, так как никаким больше образом это окно использоваться не будет, сохранив прежнюю логику полностью
|
|
||
| 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": |
| from utils.tray_common import ensure_ctk_thread, ctk_run_dialog | ||
|
|
||
| if ensure_ctk_thread(ctk, "auto"): | ||
| if threading.current_thread().name == "ctk-root": |
There was a problem hiding this comment.
Магическое значение ctk-root
Лучше в tray_common сделать проверку с вынесением ctk-root в константу из этих проверок и ensure_ctk_thread
| 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") |
There was a problem hiding this comment.
В windows.py уже есть ICON_PATH
Стоит унифицировать
| 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" |
There was a problem hiding this comment.
Магические значения. Используйте CtkTheme
|
|
||
| if icon_path: | ||
| try: | ||
| root.after(200, lambda: root.iconbitmap(icon_path)) |
| body_bg = "#2b2b2b" if dark else "#ffffff" | ||
| text_color = theme.text_primary | ||
|
|
||
| root = ctk.CTkToplevel(parent) if parent is not None else ctk.CTkToplevel() |
There was a problem hiding this comment.
эквивалентно CTkToplevel(parent)
|
Исправлено
|
|
Плюсом я конфликт в windows.py исправил после мержа pr #1025, и также у меня не запускалось приложение после сборки с решенным конфликтом, из-за того что .json локализацию забыли в конфиг и pyinstaller положить, починил и это |
| 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, |
| datas=[], | ||
| datas=[ | ||
| (os.path.join(os.path.dirname(SPEC), os.pardir, 'ui', 'i18n', '*.json'), 'ui/i18n'), | ||
| ], |
| datas=[(ctk_path, 'customtkinter/')], | ||
| datas=[ | ||
| (ctk_path, 'customtkinter/'), | ||
| (os.path.join(os.path.dirname(SPEC), os.pardir, 'ui', 'i18n', '*.json'), 'ui/i18n'), | ||
| ], |
|
откатил |
Добавлен новый модуль - ui/ctk_dialogs.py.
В нем все функции вызова любых по типу CTk окон, обычные сообщения - show_info, ошибки - show_error, вопросы "Да/Нет" - ask_yes_no и окно загрузки обновления с прогрессом - run_with_progress (оно теперь одно из компонентов CTk окон).
В итоге, на Windows (неважно на 11, 10 или 7 винде) это добавляет полную поддержку темной темы в программу, теперь включая темную тему, она распространится не только на основное окно трей-настроек, но и на все диалоговые окна/ошибки/предупреждения и тому подобные окна.
При этом поддержка светлой темы никуда не исчезла.
Пока что, на всякий случай, если по какой либо причине будет ошибка при отрисовке CTk сообщений, оставлен fallback на стандартные win32 уведомления/диалоги.
Также пофикшен баг, или недочет (не знаю как назвать), когда при включенной светлой теме, подсказки под параметрами в настройках оставались в темной теме.
Если хотите сами протестировать работу проги, можете скачать артефакт из actions в моем форке
Скрины:
(на начало в заголовках не обращайте внимания, я запрашивал уведомления напрямую через скрипт, а не получал их нормальным способом, и из-за этого писалось в начале заголовка - "dlg-X", в обычном использовании выглядит примерно так)


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