Attention, ceci est un texte en chantier. C'est une traduction (plus ou moins fidèle) de ce document, lui-même tiré du HOWTO officiel. Je vais probablement en profiter au passage pour rajouter quelques exemples.
La bibliothèque (n)curses propose des facilités pour la lecture du clavier et l'affichage écran sur les terminaux texte, tels que les VT100s, la console Linux, et les terminaux X11 tels que xterm et rxvt. Ces terminaux d'affichage supportent divers codes de controle pour faire des opérations classiques comme le déplacement du curseur, les scrollings d'écrans, l'effacement de zones. Chaque terminal utilise des codes différents, et chacun a des propres petits quirks.
Dans le monde des écrans X, quelqu'un peut se dire "Oui, et ?" Bien sûr, les terminaux à écran texte sont d'une technologie obsolète, mais il y a des niches dans lesquelles la possibilité de faire des choses élégantes a une certaine valeur. La première est celle des Unices embarqués ou minimalistes qui n'embarquent pas de serveur X. Une autre est celle des outils d'installation ou de configuration qui peuvent avoir à fonctionner avant que X ne soit disponible.
La bibliothèque curses cache les différences entre les terminaux, et propose au programmeur une abstraction d'affichage, lequel contient plusieurs fenêtres ne se recouvrant pas. Le contenu d'une fenêtre peut être modifiée de divers façons: ajouter du texte, en effacer, changer son apparence. Et curses trouve automagiquement les codes de contrôle qui doivent être envoyés au terminal pour obtenir le bon résultat.
Cette bibliothèque a été à l'origine écrite pour les Unices BSD; les dernières versions du sysV d'AT&T ont ajoutées des améliorations. Le curses de BSD n'est plus supporté et a été remplace par ncurses, qui est une implémentation libre de l'interface AT&T. Si vous utilisez un système libre, vous avez presque certainement ncurses.
Personne n'a fait un portage Windows du module curses. Sur cette plateforme, vous pouvez essayer le module Console écrit par Fredrik Lundh. Il propose un curseur adressable, et le support complet du clavier et de la souris. Ce module est disponible là.
Le module Python est un enrobage assez simple sur les fonctions C proposées par curses; si vous êtes habitués à la programmation curses en C, vous n'aurez aucun mal à ré-utiliser vos connaissances. La plus grosse différence est que l'interface Python rend les choses plus simples, en agrégant diverses fonctions comme addstr, mvaddstr, mvwaddstr dans une unique méthode addstr(). Vous découvrirez les détails un peu plus tard.
Avant que l'on ne puisse faire quoique ce soit, curses doit être initialisé. C'est fait en appelant la fonction initscr(), qui va déterminer le type du terminal, puis lui envoyer les bons codes d'intitialisation, et créer quelques structures internes de données. En cas de succès, initscr() retourne un objet window qui représente l'écran entier. Il est habituellement appelé stdscr, d'après le nom de la variable C correspondante.
import curses stdscr = curses.initscr()
En général, les applications curses coupent l'écho automatique du clavier vers l'écran, de manière à être capable de lire les touches et de ne les afficher que dans certaines circonstances. Pour cela, on appelle la fonction noecho(). Ces applications veulent communément aussi réagir instantanément à la pression d'une touche, sans attendre que la clef ENTER soit enfoncée; on appelle ça le mode cbreak, par opposition à l'habituel mode bufferisé.
curses.noecho() curses.cbreak()
En général, les terminaux renvoient les touches spéciales (déplacement du curseur, navigation (PageUp, Home)) sous forme d'une séquence d'échappement multi-caractères. Bien que vous puissiez écrire votre application pour qu'elle s'attende à de telles séquences et les traite correctement, il vaut mieux laisser faire (n)curses qui va vous retourner une valeur spéciale telle que curses.KEY-LEFT. Pour obtenir ce comportement, il faut enclencher le mode keypad.
curses.keypad(1)
Mettre fin à une application (n)curses est beaucoup plus facile que la mettre en route. Afin de retourner au mode de fonctionnement amical d'origine du terminal, vous devez appeler:
curses.nocbreak() stdscr.keypad(0) # mmmm ? curses.echo() curses.endwin()
Du point de vue d'un programmeur C, (n)curses peut parfois ressembler à un brouillard de fonctions, toutes subtilement différentes. Par example, addstr() affiche un texte à la position courante du curseur dans la fenêtre stdscr, tandis que mvaddstr() déplace le curseur à une coordonnée [lig,col] donnée avant d'afficher le texte. On a aussi waddstr() et mvwaddstr() qui font en gros pareil, mais dans une fenètre spécifique.
Heureusement, l'interface Python cache tous ces détails; stdscr est une fenètre comme toute les autres, et des méthodes comme addstr() acceptent diverses formes d'argument. Habituellement, il y a quatre formes différentes.
Forme | Description |
---|---|
str ou ch | Affiche la chaine str ou le caractère ch. |
str ou ch, attr | Affiche la chaine str ou le caractère ch, en utilisant l'attribut attr. |
x, y, str ou x, y, ch | Déplacement à la position x, y dans le fenêtre, et affiche la chaine str ou le caractère ch. |
x, y, str, attr ou x, y, ch, attr | Déplacement à la position x, y dans le fenêtre, et affiche la chaine str ou le caractère ch, en utilisant l'attribut attr. |
Et encore une page jamais finie...