From dd5601ce6478525cd1e4d7c62362c4365c9c119c Mon Sep 17 00:00:00 2001 From: Tom Schimansky Date: Thu, 17 Feb 2022 16:39:39 +0100 Subject: [PATCH] added dark titlebar on Windows --- customtkinter/__init__.py | 2 +- customtkinter/customtkinter_entry.py | 7 ++++- customtkinter/customtkinter_tk.py | 43 ++++++++++++++++++++++++++++ setup.py | 2 +- 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/customtkinter/__init__.py b/customtkinter/__init__.py index e6ea883..f63ff06 100644 --- a/customtkinter/__init__.py +++ b/customtkinter/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.1" +__version__ = "2.2" from .customtkinter_button import CTkButton from .customtkinter_slider import CTkSlider diff --git a/customtkinter/customtkinter_entry.py b/customtkinter/customtkinter_entry.py index a5bc327..821c711 100644 --- a/customtkinter/customtkinter_entry.py +++ b/customtkinter/customtkinter_entry.py @@ -116,7 +116,12 @@ class CTkEntry(tkinter.Frame): if isinstance(self.master, CTkFrame): return self.master.fg_color else: - return self.master.cget("bg") + try: + return self.master.cget("bg") + except: + pass + #print(self.master["style"]) + #return self.master.cget("background") @staticmethod def calc_optimal_corner_radius(user_corner_radius): diff --git a/customtkinter/customtkinter_tk.py b/customtkinter/customtkinter_tk.py index f5f6f6f..b3cf9f7 100644 --- a/customtkinter/customtkinter_tk.py +++ b/customtkinter/customtkinter_tk.py @@ -3,6 +3,7 @@ from distutils.version import StrictVersion as Version import sys import os import platform +import ctypes from .appearance_mode_tracker import AppearanceModeTracker from .customtkinter_color_manager import CTkColorManager @@ -30,6 +31,12 @@ class CTk(tkinter.Tk): AppearanceModeTracker.add(self.set_appearance_mode, self) super().configure(bg=CTkColorManager.single_color(self.fg_color, self.appearance_mode)) + if sys.platform.startswith("win"): + if self.appearance_mode == 1: + self.windows_set_titlebar_color(self, "dark") + else: + self.windows_set_titlebar_color(self, "light") + def destroy(self): AppearanceModeTracker.remove(self.set_appearance_mode) self.disable_macos_dark_title_bar() @@ -95,10 +102,46 @@ class CTk(tkinter.Tk): os.system("defaults delete -g NSRequiresAquaSystemAppearance") # This command reverts the dark-mode setting for all programs. + @staticmethod + def windows_set_titlebar_color(window, color_mode: str): + """ + Set the titlebar color of the window to light or dark theme on Microsoft Windows. + + Credits for this function: + https://stackoverflow.com/questions/23836000/can-i-change-the-title-bar-in-tkinter/70724666#70724666 + + MORE INFO: + https://docs.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute + """ + + window.update() + + if color_mode.lower() == "dark": + DWMWA_USE_IMMERSIVE_DARK_MODE = 20 + elif color_mode.lower() == "light": + DWMWA_USE_IMMERSIVE_DARK_MODE = 19 + else: + return + + set_window_attribute = ctypes.windll.dwmapi.DwmSetWindowAttribute + get_parent = ctypes.windll.user32.GetParent + hwnd = get_parent(window.winfo_id()) + rendering_policy = DWMWA_USE_IMMERSIVE_DARK_MODE + value = 2 + value = ctypes.c_int(value) + set_window_attribute(hwnd, rendering_policy, ctypes.byref(value), + ctypes.sizeof(value)) + def set_appearance_mode(self, mode_string): if mode_string.lower() == "dark": self.appearance_mode = 1 elif mode_string.lower() == "light": self.appearance_mode = 0 + if sys.platform.startswith("win"): + if self.appearance_mode == 1: + self.windows_set_titlebar_color(self, "dark") + else: + self.windows_set_titlebar_color(self, "light") + super().configure(bg=CTkColorManager.single_color(self.fg_color, self.appearance_mode)) diff --git a/setup.py b/setup.py index 61a088a..d38ccc3 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,7 @@ def read(filename): setup(name="customtkinter", - version="2.1", + version="2.2", author="Tom Schimansky", license="Creative Commons Zero v1.0 Universal", url="https://github.com/TomSchimansky/CustomTkinter",