Des petites libs pour le terminal, réunies dans un seul paquet. Des couleurs, des icônes, un fichier JSON qui se souvient, les infos de ta machine, et une saisie de mot de passe avec des *. Chaque sous-module se charge seulement quand on l'importe.
Puis importe seulement ce dont tu as besoin, avec un petit surnom (c'est la convention de toute la doc) :
python
from simplesuit import colors as sc # Couleurs RGB 24 bits, dégradés, stylesfrom simplesuit import icons as si # Icônes Nerd Fontsfrom simplesuit import json as sj # Un fichier JSON comme un petit dictionnaire qui restefrom simplesuit import sys as ss # Infos système, et saisie de mot de passe
🪤N'écris pas import json tout court pour simplesuit
simplesuit.json et simplesuit.sys portent le même nom que des modules de Python. Écris toujours from simplesuit import json as sj : ton import json et ton import sys habituels restent intacts.
sc.show_palette() affiche les 246 couleurs avec leur nom, si.show_icons() les 109 icônes. Sur ce site, les pages colors et icons les montrent aussi : un clic copie le nom.
💡Mesurer un texte coloré
Les couleurs ajoutent des caractères invisibles : len(sc.red("abc")) ne vaut pas 3. Pour aligner des colonnes, mesure len(sc.strip(texte)).
Ça marche sous Windows et Linux ?
Oui pour colors, icons, json et presque tout sys. Le volume du son et le nom du wifi lisent des réglages de macOS : ailleurs, ces fonctions renvoient None. Sous Windows, utilise Windows Terminal pour les couleurs.
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
Les icônes
Des icônes Nerd Font par leur nom, avec une couleur si tu veux. ⚠️ Il faut une Nerd Font dans le terminal (sinon : des carrés vides).
icones.py
from simplesuit import icons as si
print(si.icon("python", "yellow"), "Python")
print(si.icon("apple"), si.icon("linux"), si.icon("windows"))
print(si.icon("heart", "crimson", styles="bold"), "avec un style")
print(si.github, "raccourci : si.github au lieu de si.icon('github')")
print(si.search("arrow")) # ['arrow_right', 'arrow_left', 'arrow_up', 'arrow_down']
Batterie et fichiers
La bonne icône selon le niveau de batterie, ou selon le type de fichier.
batterie_et_fichiers.py
from simplesuit import icons as si
for niveau in (95, 70, 40, 15, 5):
print(si.battery(niveau), f"{niveau} %")
print(si.battery(50, plugged=True), "en charge")
for fichier in ("main.py", "photo.png", "notes.md", "archive.zip", "."):
print(si.file_icon(fichier), fichier)
Animation de chargement
spinner(i) donne l'image n°i d'un cercle qui tourne : à afficher en boucle.
spinner.py
import time
from simplesuit import icons as si
for i inrange(30):
print(f"\r{si.spinner(i)} Chargement…", end="", flush=True)
time.sleep(0.08)
print(f"\r{si.icon('check', 'lime')} Terminé ! ")
Sauvegarder des réglages
Un fichier JSON utilisé comme un petit dictionnaire qui reste après la fermeture du programme. Le fichier (data.json par défaut) est créé à côté du script lancé.
reglages.py
from simplesuit import json as sj
sj.put("theme", "sombre")
sj.put("volume", 70)
sj.put("favoris", ["capy", "simplesuit"])
print(sj.get("theme")) # sombreprint(sj.get("langue", default="fr")) # fr (la clé n'existe pas encore)print(sj.has("volume")) # Trueprint(sj.load()) # tout le fichier, en dict
sj.delete("volume")
print(sj.get_file()) # chemin du fichier utilisé
Compter les lancements
Le nombre augmente à chaque fois que tu relances le script.
compteur.py
from simplesuit import json as sj
lancements = sj.get("lancements", 0) + 1
sj.put("lancements", lancements)
print(f"Ce script a été lancé {lancements} fois")
Plusieurs fichiers
set() choisit le fichier pour toutes les fonctions ; file= pour un seul appel.
plusieurs_fichiers.py
from simplesuit import json as sj
sj.set("scores.json")
sj.put("alice", 120)
sj.put("bob", 95)
sj.put("derniere_partie", "2026-10-18", file="historique.json")
meilleur = max(sj.load(), key=sj.load().get)
print("Meilleur score :", meilleur) # aliceprint(sj.get("derniere_partie", file="historique.json"))
sj.clear() # Vide scores.json
Résumé du système
Toutes les infos en une ligne de code.
resume.py
from simplesuit import sys as ss
for nom, valeur in ss.summary().items():
print(f"{nom:>10} : {valeur}")
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})")
Réseau et machine
Connexion, adresses IP, mémoire, disque et temps depuis le démarrage.
reseau_et_machine.py
from simplesuit import sys as ss
print("Connecté à internet :", ss.online())
print("IP locale :", ss.local_ip())
print("IP publique :", ss.public_ip()) # Demande internet (≈ 1 s)print("Données reçues :", ss.net_received())
print(f"Processeur : {ss.cpu()} % ({ss.cpu_cores()} cœurs, {ss.cpu_type()})")
print(f"Mémoire : {ss.ram_used()} / {ss.ram_total()}")
print(f"Disque : {ss.disk_free()} libres sur {ss.disk_total()}")
print("Allumé depuis :", ss.uptime_text())
Une liste qui grandit, et un bel affichage
append() ajoute à la liste d'une clé (et la crée si elle n'existe pas encore). show() affiche le fichier avec des couleurs et des retours à la ligne.
liste_et_affichage.py
from simplesuit import json as sj
sj.set("users.json")
sj.append("users", {"name": "Zoe", "age": 14, "id": 30})
sj.append("users", {"name": "Izac", "age": 15, "id": 31})
sj.show() # Tout le fichier, en couleurs
sj.show({"ok": True}) # Marche aussi avec un dict
texte = sj.pretty(sj.load()) # Le même texte coloré, sans l'afficher
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')}")