from pathlib import Path import platform if platform.system() == "Darwin": sun_valley_tcl = "sun-valley_darwin.tcl" else: sun_valley_tcl = "sun-valley.tcl" inited = False root = None def init(func): def wrapper(*args, **kwargs): global inited global root if not inited: from tkinter import _default_root path = (Path(__file__).parent / sun_valley_tcl).resolve() try: _default_root.tk.call("source", str(path)) except AttributeError: raise RuntimeError( "can't set theme. " "Tk is not initialized. " "Please first create a tkinter.Tk instance, then set the theme." ) from None else: inited = True root = _default_root return func(*args, **kwargs) return wrapper @init def set_theme(theme): if theme not in {"dark", "light"}: raise RuntimeError(f"not a valid theme name: {theme}") root.tk.call("set_theme", theme) @init def get_theme(): theme = root.tk.call("ttk::style", "theme", "use") try: return {"sun-valley-dark": "dark", "sun-valley-light": "light"}[theme] except KeyError: return theme @init def toggle_theme(): if get_theme() == "dark": use_light_theme() else: use_dark_theme() use_dark_theme = lambda: set_theme("dark") use_light_theme = lambda: set_theme("light")