libs.zazac.link

simplesuit.icons v0.2.1

Icônes Nerd Fonts pour le terminal

Inclus dans simplesuit : installe simplesuit pour l'avoir.

import simplesuit.icons · PyPI : simplesuit · Python 3.9+ · dépend de psutil

Guide

Des icônes dans le terminal : logos (Apple, Python, GitHub…), fichiers, dossiers, batterie, flèches, météo… Ce sont des caractères spéciaux des Nerd Fonts : ils s'écrivent comme du texte, se colorent comme du texte, et tiennent dans un print.

Installer une Nerd Font (une seule fois)#

Sans Nerd Font, le terminal ne connaît pas ces caractères et affiche des carrés vides □.

  1. Installe une Nerd Font : sur Mac, brew install --cask font-jetbrains-mono-nerd-font (ou télécharge-la sur nerdfonts.com).
  2. Choisis-la dans les réglages de ton terminal (Terminal, iTerm2, VS Code : Font Family → JetBrainsMono Nerd Font).
  3. Teste : python3 -c "from simplesuit import icons as si; print(si.apple, si.python, si.heart)".

Dans VS Code

Réglage terminal.integrated.fontFamily : "JetBrainsMono Nerd Font". Le terminal intégré utilise alors les icônes.

Utiliser une icône#

python
from simplesuit import icons as si

print(si.apple, si.python, si.github)            # Raccourci : le nom de l'icône
print(si.icon("python"))                         # Pareil, avec le nom en texte
print(si.icon("heart", "crimson"))               # En couleur (un nom ou HEX de simplesuit.colors)
print(si.icon("check", "mint", styles="bold"))   # + style
print(f"{si.folder} Documents   {si.file_pdf} cours.pdf")

icon() ou le raccourci ?

si.apple est le plus court. si.icon("apple") sert quand le nom est dans une variable, ou pour ajouter une couleur d'un coup.

Les aides toutes faites#

Batterie#

si.battery(pourcentage, plugged=False) choisit la bonne icône : pleine (≥ 90 %), ¾, ½, ¼, vide (< 10 %), ou un éclair si le chargeur est branché.

python
from simplesuit import icons as si, sys as ss

print(si.battery(ss.battery() or 0, plugged=bool(ss.plugged())), f"{ss.battery()} %")

Fichiers et dossiers#

si.file_icon(chemin) donne l'icône d'un dossier, ou celle d'un fichier selon son extension (.py, .js, .json, .md, .pdf, .png, .mp3, .zip, .sh…, sinon une icône de fichier). Parfait pour faire son propre ls :

python
import os
from simplesuit import icons as si

for nom in sorted(os.listdir(".")):
    print(si.file_icon(nom), nom)

Un dossier n'est reconnu que s'il existe

file_icon regarde le disque pour savoir si c'est un dossier : un chemin qui n'existe pas (ou relatif au mauvais endroit) est traité comme un fichier.

Animation de chargement#

si.spinner(i) donne l'image n°i d'un cercle qui tourne ; elle revient au début toute seule.

python
import time
from simplesuit import icons as si

for i in range(30):
    print(f"\r{si.spinner(i)} Chargement…", end="", flush=True)
    time.sleep(0.1)
print("\r" + si.check + " Terminé !     ")

Le \r

\r ramène le curseur au début de la ligne sans en créer une nouvelle : chaque image remplace la précédente. Ajoute quelques espaces à la fin du dernier texte pour effacer les restes d'un texte plus long.

Trouver une icône#

python
si.search("arrow")      # ['arrow_right', 'arrow_left', 'arrow_up', 'arrow_down']
si.show_icons()         # Les 109 icônes, avec leur nom
si.show_icons("file")   # Seulement celles qui contiennent "file"

Une faute de frappe ? Le message propose les bons noms :

résultat
ValueError: simplesuit.icons : unknown icon: pythn (did you mean: python ?)

Plus bas sur cette page

La constante ICONS montre toutes les icônes (avec la police déjà chargée sur ce site) : un clic copie le nom.

Il me faut une icône qui n'est pas dans la liste

Toute icône Nerd Font est un caractère : trouve son code sur nerdfonts.com/cheat-sheet et écris-le directement, par exemple "". Les couleurs de simplesuit.colors marchent dessus aussi.

Exemples

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 in range(30):
    print(f"\r{si.spinner(i)} Chargement…", end="", flush=True)
    time.sleep(0.08)
print(f"\r{si.icon('check', 'lime')} Terminé !   ")

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 is None:
    print("Pas de batterie sur cet ordinateur")
else:
    couleur = "lime" if niveau > 50 else "orange" if niveau > 20 else "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})")

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)
def barre(pourcentage, largeur=20):
    plein = round(pourcentage / 100 * largeur)
    couleur = "mint" if pourcentage < 60 else "orange" if pourcentage < 85 else "tomato"
    return sc.color("█" * plein, couleur) + sc.color("░" * (largeur - plein), "dimgray")


try:
    while True:
        cpu, ram, disque = ss.cpu(), ss.ram(), ss.disk()  # cpu() attend 0,3 s : c'est notre pause
        print("\033[2J\033[H", end="")                   # Effacer l'écran, curseur en haut
        print(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() is not None:
            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)
except KeyboardInterrupt:
    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("."):
        continue
    if 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')}")

Référence

Fonctions

icon(name, color=None, **options)

Récupérer une icône par son nom, avec une couleur si on veut

Exicon("apple") / icon("python", "yellow") / icon("heart", "crimson", styles="bold")

Voir le code
python
def icon(name, color=None, **options):
    key = name.lower().replace(" ", "_")
    if key not in ICONS:
        raise ValueError(f"simplesuit.icons : unknown icon: {name}" + _suggest(key))
    char = ICONS[key]
    return sc.color(char, color, **options) if (color or options) else char

battery(percent, plugged=False)

Icône de batterie selon le pourcentage, avec un éclair si branché

Exbattery(64) -> icône "à moitié" / battery(64, plugged=True) -> éclair

Voir le code
python
def battery(percent, plugged=False):
    if plugged:
        return ICONS["bolt"]
    if percent >= 90:
        return ICONS["battery_full"]
    if percent >= 60:
        return ICONS["battery_75"]
    if percent >= 35:
        return ICONS["battery_50"]
    if percent >= 10:
        return ICONS["battery_25"]
    return ICONS["battery_empty"]

file_icon(path)

Icône pour un fichier ou un dossier (pratique pour ls)

Exfile_icon("main.py") -> icône Python / file_icon("Documents") -> dossier

Voir le code
python
def file_icon(path):
    path = pth.Path(path)
    if path.is_dir():
        return ICONS["folder"]
    name = EXTENSIONS.get(path.suffix.lower(), "file")
    return ICONS[name]

spinner(i)

Image n°i du spinner (tourne en boucle : 0, 1, ..., 5, 0, 1...)

Exfor i in range(100): print(spinner(i), end="\r")

Voir le code
python
def spinner(i):
    return SPINNER[i % len(SPINNER)]  # % -> revient au début après la dernière image

show_icons(word='')

Afficher toutes les icônes (ou seulement celles qui contiennent un mot)

Voir le code
python
def show_icons(word=""):
    for name in search(word):
        print(f"  {ICONS[name]}  {name}")

Constantes

ICONS

⚠️ Ces icônes ne s'affichent qu'avec une Nerd Font dans le terminal

(sinon on voit des carrés vides)

Codes vérifiés avec la liste officielle de Nerd Fonts v3

109 icônes · clique pour copier un nom

SPINNER

Images d'animation "chargement" (un cercle qui tourne), à afficher l'une après l'autre

Glyphes extra-progress_spinner_1 à 6 de Nerd Fonts v3

     

EXTENSIONS

Icône selon l'extension d'un fichier (pour ls)

.py'python'
.js'javascript'
.html'html'
.css'css'
.json'json'
.md'markdown'
.java'java'
.c'c'
.cpp'cpp'
.rs'rust'
.swift'swift'
.sh'shell'
.zsh'shell'
.txt'file_text'
.pdf'file_pdf'
.png'file_image'
.jpg'file_image'
.jpeg'file_image'
.gif'file_image'
.svg'file_image'
.zip'file_zip'
.tar'file_zip'
.gz'file_zip'
.mp3'file_audio'
.wav'file_audio'
.mp4'file_video'
.mov'file_video'

Raccourcis dynamiques

Magie : permet d'écrire si.apple au lieu de si.icon("apple")

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 in ICONS:
        return ICONS[name]
    raise AttributeError(f"module 'simplesuit.icons' has no attribute '{name}'" + _suggest(name))