L'un des défis majeurs lorsqu'on développe une interface graphique en Python brut (avec la bibliothèque standard Tkinter), c'est l'esthétique. Par défaut, Tkinter propose un rendu qui rappelle fortement les interfaces des années 90, et de nombreux développeurs l'abandonnent rapidement, le jugeant trop "moche" ou archaïque.
Pourtant, GrimOS réussit un tour de force : il est capable de simuler l'élégance de macOS Classic, les couleurs vibrantes d'un Ubuntu ou l'austérité rassurante d'un Windows 98.
Ce miracle repose sur le moteur de thèmes, une architecture technique ingénieuse qui sépare la logique des applications de leur apparence.
Dans une application GrimOS, vous ne verrez presque jamais un développeur écrire tk.Button(bg="red", fg="white"). S'il faisait cela, l'application ne s'adapterait pas lorsque l'utilisateur changerait de thème depuis les paramètres.
Au lieu de cela, l'application se contente de déclarer ses composants (Boutons, Textes) de manière neutre. C'est le moteur de thèmes qui, tel un peintre en bâtiment, passe derrière pour colorer chaque élément.
core/theme.py)Si vous ouvrez le fichier core/theme.py, vous découvrirez le secret de GrimOS : la commande magique option_add.
def apply_theme(root, theme_name):
theme = THEMES.get(theme_name, THEMES["GrimOS"])
# Configuration globale pour tous les futurs widgets
root.option_add("*background", theme["bg"])
root.option_add("*foreground", theme["fg"])
root.option_add("*font", theme["font"])
# Styles spécifiques
root.option_add("*Button.background", theme["btn_bg"])
root.option_add("*Button.relief", theme["relief"])
Cette fonction intercepte le cœur même de Tkinter (l'objet root). Grâce à l'étoile *, elle applique une règle absolue : "Désormais, tout objet créé dans le système aura ces couleurs et cette police par défaut".
Ainsi, l'explorateur de fichiers, la calculatrice ou l'éditeur de texte se retrouvent instantanément rhabillés sans même s'en rendre compte.
Qu'est-ce qu'un thème dans GrimOS ? Ce n'est pas un fichier CSS complexe. C'est simplement un petit bloc de dictionnaire (une liste de variables).
Si l'on prend l'exemple du célèbre thème Win 98, voici sa définition exacte dans le code :
"Win 98": {
"bg": "#C0C0C0", # Le fameux gris de Windows 98
"fg": "black", # Texte noir
"font": ("MS Sans Serif", 9), # La police d'époque
"btn_bg": "#C0C0C0",
"relief": "raised", # L'effet 3D "bouton surélevé"
"desktop_bg": "#008080", # Le fond d'écran bleu/vert caractéristique
"desktop_fg": "white",
"accent": "#000080",
"title_bg": "#000080", # La barre de titre bleu foncé
"title_fg": "white",
...
}
Ce simple changement de 10 variables suffit à métamorphoser intégralement le système !
Le système est tellement ouvert que vous pouvez créer votre propre thème en 30 secondes.
core/theme.py avec l'Éditeur de Code.THEMES, par exemple : "Cyberpunk": {
"bg": "black",
"fg": "#00FF00",
"font": ("Courier New", 11, "bold"),
"btn_bg": "#222222",
"relief": "flat",
"desktop_bg": "black",
"desktop_fg": "#00FF00",
"accent": "#FF00FF",
"title_bg": "#FF00FF",
"title_fg": "black",
"taskbar_bg": "black",
"taskbar_fg": "#00FF00",
"start_btn_bg": "#FF00FF",
"start_btn_fg": "black",
"panel_btn_bg": "#222222",
"window_border": "#FF00FF",
"icon_theme": "grimos"
}