| 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") |
|
|