Des couleurs RGB 24 bits dans le terminal : 16 millions de couleurs, qui s'affichent pareil quel que soit le thème de ton terminal. Par nom ("tomato"), en HEX ("#FF6347") ou en RGB ((255, 99, 71)), avec un fond, du gras, de l'italique, et des dégradés.
bold (gras), dim (pâle), italic, underline (souligné), blink (clignote), reverse (inverse texte et fond), strike (barré). Un seul en texte, plusieurs dans une liste : styles=["bold", "italic"].
📌Selon le terminal
Tous les terminaux ne savent pas tout faire : blink est souvent ignoré, et l'italique dépend de la police.
Un dégradé sur une ligne de ═ au-dessus et en dessous d'un titre fait une très jolie bannière de démarrage. Voir l'exemple « Une bannière de démarrage ».
Une couleur ajoute des codes invisibles (\033[38;2;…m) : len(sc.red("abc")) vaut bien plus que 3. Pour aligner un tableau, mesure len(sc.strip(texte)), ou formate le texte avant de le colorer : sc.red(f"{nom:<10}").
🪤Les couleurs dans un fichier
python3 main.py > sortie.txt écrit aussi les codes de couleur dans le fichier. Pour un texte propre : sc.strip(texte) avant de l'écrire.
💡Des couleurs à toi
Garde tes couleurs dans des constantes (TITRE = "#89B4FA") et utilise sc.color(texte, TITRE) : changer de thème, c'est changer une ligne.
Les couleurs ne s'affichent pas, je vois des [38;2;… à la place
Ton terminal ne comprend pas les couleurs 24 bits (l'ancien Terminal de Windows, certains éditeurs). Le Terminal de macOS, iTerm2, VS Code, Windows Terminal et presque tous les terminaux Linux les comprennent.
Exemples
Couleurs et styles
Colorer un texte par nom, HEX ou RGB, avec un fond et des styles (gras, italique…).
couleurs_et_styles.py
from simplesuit import colors as sc
print(sc.color("Par nom", "tomato"))
print(sc.color("En HEX", "#1E90FF"))
print(sc.color("En RGB", (120, 200, 80)))
print(sc.color(" Avec un fond ", "white", bg="crimson", styles="bold"))
print(sc.color("Plusieurs styles", "gold", styles=["bold", "underline"]))
# Raccourci : le nom de la couleur devient une fonctionprint(sc.mint("succès"), sc.error("erreur"), sc.mochamauve("Catppuccin"))
print(sc.bold("gras"), sc.italic("italique"), sc.underline("souligné"))
Dégradés
Un dégradé lettre par lettre, avec autant de couleurs que tu veux.
degrades.py
from simplesuit import colors as sc
print(sc.gradient("Bienvenue dans orsh", "cyan", "magenta"))
print(sc.gradient("Coucher de soleil", "gold", "orange", "crimson", styles="bold"))
print(sc.gradient("━" * 40, "mochablue", "mochamauve", "mochapink"))
# strip() enlève les couleurs : pratique pour mesurer la vraie longueur
titre = sc.gradient("Titre", "lime", "teal")
print(len(titre), "caractères avec les codes,", len(sc.strip(titre)), "sans")
Trouver une couleur
Voir une couleur en détail, convertir en RGB, et se faire proposer un nom quand on se trompe.
trouver_une_couleur.py
from simplesuit import colors as sc
sc.show_color("coral") # Aperçu + nom, HEX et RGBprint(sc.to_rgb("#F80")) # (255, 136, 0)print(sc.to_rgb("rgb(1, 2, 3)")) # (1, 2, 3)try:
sc.color("texte", "tomatto")
exceptValueErroras e:
print(e) # simplesuit.colors : unknown color: tomatto (did you mean: tomato ?)# sc.show_palette() affiche les 246 couleurs disponibles
Jauge de batterie en couleur
sys donne les chiffres, colors et icons les mettent en forme.
jauge_batterie.py
from simplesuit import colors as sc
from simplesuit import icons as si
from simplesuit import sys as ss
niveau = ss.battery()
if niveau isNone:
print("Pas de batterie sur cet ordinateur")
else:
couleur = "lime"if niveau > 50else"orange"if niveau > 20else"red"
barre = "█" * (niveau // 5) + "░" * (20 - niveau // 5)
reste = ss.time_left_text() or"-"print(si.battery(niveau, ss.plugged()), sc.color(barre, couleur), f"{niveau} % (reste {reste})")
Demander un mot de passe avec des *
password() affiche une * par lettre tapée. Retour arrière efface, Ctrl+U efface tout, Ctrl+C ou Ctrl+D annulent (KeyboardInterrupt / EOFError).
mot_de_passe.py
from simplesuit import colors as sc
from simplesuit import sys as ss
try:
mdp = ss.password("password > ")
confirmation = ss.password("encore une fois > ", mask="•")
except (KeyboardInterrupt, EOFError):
exit("\nannulé")
if mdp != confirmation:
exit(sc.red("Les deux mots de passe sont différents"))
print(sc.green(f"OK, {len(mdp)} caractères")) # On n'affiche jamais le mot de passe lui-même
Une bannière de démarrage
Un dégradé sur des lignes de ═ autour d'un titre : 3 lignes pour un démarrage qui a de la gueule.
banniere.py
from simplesuit import colors as sc
from simplesuit import icons as si
LARGEUR = 40
titre = f" {si.rocket} mon super programme {si.rocket} "print(sc.gradient("═" * LARGEUR, "cyan", "magenta"))
print(sc.gradient(titre.center(LARGEUR), "cyan", "magenta", styles="bold"))
print(sc.gradient("═" * LARGEUR, "magenta", "cyan"))
print(sc.color("v1.0 · tape help pour l'aide".center(LARGEUR), "gray", styles="italic"))
Mini tableau de bord
Toutes les secondes : on efface l'écran, puis on affiche les infos avec des icônes et des couleurs. Ctrl+C pour quitter.
tableau_de_bord.py
import time
from simplesuit import colors as sc
from simplesuit import icons as si
from simplesuit import sys as ss
# Une barre de progression colorée selon le niveau (vert, orange, rouge)defbarre(pourcentage, largeur=20):
plein = round(pourcentage / 100 * largeur)
couleur = "mint"if pourcentage < 60else"orange"if pourcentage < 85else"tomato"return sc.color("█" * plein, couleur) + sc.color("░" * (largeur - plein), "dimgray")
try:
whileTrue:
cpu, ram, disque = ss.cpu(), ss.ram(), ss.disk() # cpu() attend 0,3 s : c'est notre pauseprint("\033[2J\033[H", end="") # Effacer l'écran, curseur en hautprint(sc.gradient(f" {ss.hostname()} ", "cyan", "magenta", styles="bold"), "\n")
print(f"{si.cpu} CPU {barre(cpu)} {cpu:5.1f} %")
print(f"{si.memory} RAM {barre(ram)} {ram:5.1f} % {ss.ram_used()}")
print(f"{si.disk} Disque {barre(disque)} {disque:5.1f} % {ss.disk_free()} libres")
if ss.battery() isnotNone:
print(f"{si.battery(ss.battery(), bool(ss.plugged()))} Batterie {ss.battery()} %")
print(sc.color(f"\nAllumé depuis {ss.uptime_text()} · Ctrl+C pour quitter", "gray"))
time.sleep(0.7)
exceptKeyboardInterrupt:
print()
Son propre ls, avec des icônes
file_icon() choisit l'icône selon le type : dossier, .py, .json, .md, image, musique… Les dossiers en bleu et en premier, les tailles alignées à droite.
mon_ls.py
import os
from simplesuit import colors as sc
from simplesuit import icons as si
from simplesuit import sys as ss
noms = sorted(os.listdir("."), key=lambda n: (not os.path.isdir(n), n.lower()))
for nom in noms:
if nom.startswith("."):
continueif os.path.isdir(nom):
print(sc.color(f"{si.file_icon(nom)} {nom}/", "cornflowerblue", styles="bold"))
else:
taille = ss.human_size(os.path.getsize(nom))
print(f"{si.file_icon(nom)} {nom:<30} {sc.color(f'{taille:>9}', 'gray')}")
defto_rgb(color):
# Déjà un tuple / une liste (r, g, b)ifisinstance(color, (tuple, list)):
r, g, b = color
return_check(r, g, b)
text = str(color).strip().lower().replace(" ", "").replace("_", "")
# Nom de la paletteif text in PALETTE:
text = PALETTE[text].lower()
# "rgb(255,0,0)"
match = re.fullmatch(r"rgb\((\d+),(\d+),(\d+)\)", text)
if match:
return_check(*(int(x) for x in match.groups()))
# HEX : "#ff0000", "ff0000", "#f00"
text = text.lstrip("#")
if re.fullmatch(r"[0-9a-f]{3}", text):
text = "".join(c * 2for c in text) # "f00" -> "ff0000"if re.fullmatch(r"[0-9a-f]{6}", text):
returnint(text[0:2], 16), int(text[2:4], 16), int(text[4:6], 16)
raiseValueError(f"simplesuit.colors : unknown color: {color}" + _suggest(text))
defgradient(text, *colors, styles=None):
iflen(colors) < 2:
raiseValueError("simplesuit.colors : gradient needs at least 2 colors")
rgbs = [to_rgb(c) for c in colors]
steps = max(len(text) - 1, 1)
result = _style_codes(styles) # Les styles restent actifs jusqu'au RESET finalfor i, char inenumerate(text):
# Position dans le texte (0 = début, 1 = fin), étalée sur les morceaux du dégradé
pos = i / steps * (len(rgbs) - 1)
part = min(int(pos), len(rgbs) - 2) # Entre quelles couleurs on est
t = pos - part # Avancement entre ces 2 couleurs (0 -> 1)
(r1, g1, b1), (r2, g2, b2) = rgbs[part], rgbs[part + 1]
r = round(r1 + (r2 - r1) * t)
g = round(g1 + (g2 - g1) * t)
b = round(b1 + (b2 - b1) * t)
result += f"\033[38;2;{r};{g};{b}m{char}"return result + RESET
Toutes les couleurs sont en HEX (couleurs RGB "vraies", 24 bits)
-> elles s'affichent pareil quel que soit le thème du terminal
Ce sont les 148 couleurs nommées du web (CSS), + quelques extras à la fin
246 couleurs · clique pour copier un nom
Raccourcis dynamiques
Magie : permet d'écrire sc.red("texte") au lieu de sc.color("texte", "red")
Python appelle cette fonction quand on demande un nom qui n'existe pas dans le module
Voir le code
python
def__getattr__(name):
if name.lower() in PALETTE:
returnlambda text, **options: color(text, name, **options)
raiseAttributeError(f"module 'simplesuit.colors' has no attribute '{name}'" + _suggest(name.lower()))