52 lines
2.0 KiB
Python
52 lines
2.0 KiB
Python
import ctypes
|
|
import os
|
|
import platform
|
|
import sys
|
|
import tkinter
|
|
from typing import Literal
|
|
from distutils.version import StrictVersion as Version
|
|
|
|
def dark_title_bar(window, mode: Literal["dark", "light"]):
|
|
"""
|
|
MORE INFO:
|
|
https://learn.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute
|
|
"""
|
|
|
|
if mode == "dark":
|
|
value = 1
|
|
elif mode == "light":
|
|
value = 0
|
|
else:
|
|
raise ValueError()
|
|
|
|
try:
|
|
|
|
window.update()
|
|
|
|
if sys.platform.startswith("win"):
|
|
|
|
hwnd = ctypes.windll.user32.GetParent(window.winfo_id())
|
|
DWMWA_USE_IMMERSIVE_DARK_MODE = 20
|
|
DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19
|
|
|
|
# try with DWMWA_USE_IMMERSIVE_DARK_MODE
|
|
if ctypes.windll.dwmapi.DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, ctypes.byref(ctypes.c_int(value)), ctypes.sizeof(ctypes.c_int(value))) != 0:
|
|
|
|
# try with DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20h1
|
|
ctypes.windll.dwmapi.DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, ctypes.byref(ctypes.c_int(value)), ctypes.sizeof(ctypes.c_int(value)))
|
|
|
|
elif sys.platform == "darwin":
|
|
|
|
if value == 1:
|
|
if Version(platform.python_version()) < Version("3.10"):
|
|
if Version(tkinter.Tcl().call("info", "patchlevel")) >= Version("8.6.9"): # Tcl/Tk >= 8.6.9
|
|
os.system("defaults write -g NSRequiresAquaSystemAppearance -bool No")
|
|
# This command allows dark-mode for all programs
|
|
else:
|
|
if Version(platform.python_version()) < Version("3.10"):
|
|
if Version(tkinter.Tcl().call("info", "patchlevel")) >= Version("8.6.9"): # Tcl/Tk >= 8.6.9
|
|
os.system("defaults delete -g NSRequiresAquaSystemAppearance")
|
|
# This command reverts the dark-mode setting for all programs.
|
|
|
|
except Exception as err:
|
|
print(err) |