Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue180:python [2022/05/06 11:09] – d52fr | issue180:python [2022/05/09 13:55] (Version actuelle) – andre_domenech |
---|
Il y a quelques semaines, je discutais avec un nouvel utilisateur sur le forum Discord de PAGE, comparant nos carrières dans la programmation et la façon dont les choses avaient changé. Je lui ai raconté comment, à la fin des années 1980, j'avais travaillé sur un projet de création de fenêtres et de formulaires pour Turbo Pascal et Modula-2. À l'époque, tout se faisait à peu près dans des terminaux de 80x24 caractères. | Il y a quelques semaines, je discutais avec un nouvel utilisateur sur le forum Discord de PAGE, comparant nos carrières dans la programmation et la façon dont les choses avaient changé. Je lui ai raconté comment, à la fin des années 1980, j'avais travaillé sur un projet de création de fenêtres et de formulaires pour Turbo Pascal et Modula-2. À l'époque, tout se faisait à peu près dans des terminaux de 80x24 caractères. |
| |
Aujourd'hui, le mot « TUI » est très populaire et signifie « Textual User Interface », et il existe de nombreuses bibliothèques Python populaires pour faciliter le « la meilleure impression » des applications console. La plupart d'entre elles utilisent la bibliothèque Python curses sous une forme ou une autre. J'ai examiné un grand nombre de paquets disponibles et, bien que la plupart d'entre eux fassent du bon travail, ils étaient très compliqués et, pour être tout à fait honnête, avec beaucoup plus tape-à-l'œil que de substance. | Aujourd'hui, le mot « TUI » est très populaire et signifie « Textual User Interface », et il existe de nombreuses bibliothèques Python populaires pour faciliter l'« enjolivement » des applications console. La plupart d'entre elles utilisent la bibliothèque Python curses sous une forme ou une autre. J'ai examiné un grand nombre de paquets disponibles et, bien que la plupart d'entre eux fassent du bon travail, ils étaient très compliqués et, pour être tout à fait honnête, avec beaucoup de bling bling plutôt que de substance. |
| |
Je suis retourné dans les articles que j'ai écrits dans le passé et j'ai trouvé les deux articles que j'ai écrits pour Full Circle en 2010 sur Curses, alors j'ai pensé les revisiter. | Je suis retourné dans les articles que j'ai écrits dans le passé et j'ai trouvé les deux articles que j'ai écrits sur Curses pour le Full Circle en 2010, alors j'ai pensé les revisiter. |
| |
**Back to Curses | **Back to Curses |
Retour à Curses | Retour à Curses |
| |
Python pour Windows n'inclut pas le module Curses, mais il existe des bibliothèques qui peuvent faire la même chose. Puisque nous sommes sous Linux ici, nous n'avons pas à nous inquiéter. Alors commençons. | Python pour Windows n'inclut pas le module Curses, mais il existe des bibliothèques qui peuvent faire la même chose. Puisque nous sommes sous Linux ici, nous n'avons pas à nous en inquiéter. Alors commençons. |
| |
Le programme de démonstration initial que j'ai écrit est toujours un bon point de départ pour les discussions « modernes » sur curses. Jetons un rapide coup d'oeil au code (en haut à droite). | Le programme de démonstration initial que j'ai écrit est toujours un bon point de départ pour les discussions « modernes » sur curses. Jetons un rapide coup d'œil au code (en haut à droite). |
| |
Vous pouvez voir qu'il y a presque autant de lignes commentées qu'il y a de lignes de code réelles. | Vous pouvez voir qu'il y a presque autant de lignes commentées qu'il y a de lignes de code réelles. |
Lorsque nous exécutons ce code, nous voyons l'image ci-dessous. | Lorsque nous exécutons ce code, nous voyons l'image ci-dessous. |
| |
Plutôt ennuyeux mais il y a des concepts importants présentés ici. | Plutôt ennuyeux, mais il y a des concepts importants présentés ici. |
| |
Pour utiliser curses, vous devez d'abord importer la bibliothèque, puis vous devez créer un écran virtuel. | Pour utiliser curses, vous devez d'abord importer la bibliothèque, puis vous devez créer un écran virtuel. |
Nothing big, nothing special. Just a quick and dirty demo. So let’s try to do something better.** | Nothing big, nothing special. Just a quick and dirty demo. So let’s try to do something better.** |
| |
Ensuite, nous dessinons une bordure autour de l'écran et ajoutons une ligne de texte à partir de la ligne 12, colonne 25. La méthode refresh() montre vriament à l'écran ce qui a été fait. Pour voir le nouvel écran de l'interface utilisateur, vous DEVEZ appeler la méthode refresh(). | Ensuite, nous dessinons une bordure autour de l'écran et ajoutons une ligne de texte à partir de la ligne 12, colonne 25. La méthode refresh() montre vraiment ce qui a été fait. Pour voir le nouvel écran de l'interface utilisateur, vous DEVEZ appeler la méthode refresh(). |
| |
myscreen.border(0) | myscreen.border(0) |
curses.endwin() | curses.endwin() |
| |
Rien de gros, rien de spécial. Juste une démo rapide et sale. Essayons donc de faire quelque chose de mieux. | Rien de grand, rien de spécial. Juste une démo rapide et sale. Essayons donc de faire quelque chose de mieux. |
| |
| |
num_rows, num_cols = screen.getmaxyx()** | num_rows, num_cols = screen.getmaxyx()** |
| |
Cette fois, nous allons créer un programme de démonstration montrant comment centrer une ligne dans le terminal et montrer tous les différents attributs qui peuvent être définis pour fournir différents effets. Tout d'abord, nous devons importer la bibliothèque curses. | Cette fois-ci, nous allons créer un programme de démonstration expliquant comment centrer une ligne dans le terminal, et montrer tous les différents attributs qui peuvent être définis pour fournir différents effets. Tout d'abord, nous devons importer la bibliothèque curses. |
| |
import curses | import curses |
Ensuite (ci-dessous), nous allons créer une fonction qui déterminera la longueur d'une chaîne de caractères et retournera une valeur pour la position horizontale (position x) afin que la chaîne soit centrée dans la fenêtre du terminal. | Ensuite (ci-dessous), nous allons créer une fonction qui déterminera la longueur d'une chaîne de caractères et retournera une valeur pour la position horizontale (position x) afin que la chaîne soit centrée dans la fenêtre du terminal. |
| |
Maintenant nous pouvons initialiser curses et obtenir le nombre de lignes et de colonnes du terminal. Ceci nous permet de se servir du programme avec n'importe quelle taille de terminal que vous pouvez utiliser. Remarquez la ligne juste après la ligne initscr(). Elle nous permet d'utiliser des couleurs dans nos chaînes de caractères. Si vous ne définissez pas cela, les couleurs ne fonctionneront pas, et toute la documentation sur curses dit que cet appel doit être fait « le plus tôt possible après l'initialisation ». Nous récupérons également le nombre de lignes et de colonnes et les plaçons dans des variables globales afin de pouvoir utiliser la variable num_cols dans la fonction centre. | Maintenant nous pouvons initialiser curses et obtenir le nombre de lignes et de colonnes du terminal. Cela nous permet de nous servir du programme avec n'importe quelle taille de terminal utilisable. Remarquez la ligne juste après la ligne initscr(). Elle nous permet d'utiliser des couleurs dans nos chaînes de caractères. Si vous ne définissez pas cela, les couleurs ne fonctionneront pas, et toute la documentation sur curses dit que cet appel doit être fait « le plus tôt possible après l'initialisation ». Nous récupérons également le nombre de lignes et de colonnes et les plaçons dans des variables globales afin de pouvoir utiliser la variable num_cols dans la fonction centre. |
| |
screen = curses.initscr() | screen = curses.initscr() |
The code for the two demos will be on my repository at https://github.com/gregwa1953/FCM-180 ** | The code for the two demos will be on my repository at https://github.com/gregwa1953/FCM-180 ** |
| |
Enfin, nous utilisons la fonction getch() pour attendre avec un appel bloquant qu'un caractère du clavier soit pressé. Remarquez que nous n'avons pas besoin de mettre un emplacement spécifique pour le curseur, puisque curses se souvient de la dernière position qui a été utilisée, ce qui est le cas lorsque nous imprimons la ligne « Press a key to end demo... ». Une fois que l'utilisateur a appuyé sur une touche, nous libérons l'écran du terminal. | Enfin, nous utilisons la fonction getch() pour attendre avec un appel bloquant qu'un caractère du clavier soit enfoncé. Remarquez que nous n'avons pas besoin de mettre un emplacement spécifique pour le curseur, puisque curses se souvient de la dernière position qui a été utilisée, ce qui est le cas lorsque nous imprimons la ligne « Press a key to end demo... ». Une fois que l'utilisateur a appuyé sur une touche, nous libérons l'écran du terminal. |
| |
c = screen.getch() | c = screen.getch() |