Je voudrais écraser quelque chose sur une ligne au-dessus dans une console série. Existe-t-il un caractère qui me permette de passer au-dessus ?
Réponses
Trop de publicités?La plupart des terminaux comprennent Codes d'échappement ANSI . Les codes pertinents pour ce cas d'utilisation :
-
"\033[F"
- déplacer le curseur au début de la ligne précédente -
"\033[A"
- déplacer le curseur vers le haut d'une ligne
Exemple (Python) :
print("\033[FMy text overwriting the previous line.")
Non, pas vraiment facilement, pour cela il faudrait utiliser quelque chose comme la fonction bibliothèque de curses Il est possible d'utiliser l'outil d'aide à la décision, surtout si vous voulez avoir plus de contrôle sur le placement du curseur et faire plus de choses de manière programmatique.
Voici un lien pour les documents Python sur Programmation avec Curses et cette courte tutoriel/exemple pourrait également vous intéresser.
Je viens de trouver cette note dans le docs si vous utilisez Windows :
Personne n'a fait un portage Windows du module curses. Sur une plateforme essayez le module Console écrit par Fredrik Lundh. Le module Console fournit une sortie de texte adressable par le curseur, ainsi qu'un support complet de la souris et du clavier, http://effbot.org/zone/console-index.htm .
Je crois que pour le C++, il existe le NCurses la bibliothèque, la page liée comporte une section sur déplacer le curseur si vous voulez vous amuser avec le C++. Il y a aussi le HowTo de programmation NCurses .
Long Il y a un certain temps, j'ai utilisé la bibliothèque curses avec C avec beaucoup de succès.
Mise à jour :
J'ai manqué la partie concernant l'exécution sur un terminal/série, pour cela la séquence d'échappement ANSI, surtout pour une tâche simple comme la vôtre, sera la plus facile et je suis d'accord avec la solution de @SvenMarnach pour cela.
Le retour chariot peut être utilisé pour aller en début de ligne, et le code ANSI ESC A
( "\033[A"
) peut vous faire remonter une ligne. Cela fonctionne sous Linux. Elle peut fonctionner sous Windows en utilisant la commande colorama
pour activer les codes ANSI :
import time
import sys
import colorama
colorama.init()
print("Line 1")
time.sleep(1)
print("Line 2")
time.sleep(1)
print("Line 3 (no eol)", end="")
sys.stdout.flush()
time.sleep(1)
print("\rLine 3 the sequel")
time.sleep(1)
print("\033[ALine 3 the second sequel")
time.sleep(1)
print("\033[A\033[A\033[ALine 1 the sequel")
time.sleep(1)
print() # skip two lines so that lines 2 and 3 don't get overwritten by the next console prompt
print()
Sortie :
> python3 multiline.py
Line 1 the sequel
Line 2
Line 3 the second sequel
>
Sous le capot, colorama permet vraisemblablement Séquences du terminal virtuel de la console en utilisant SetConsoleMode
.
Il n'existe pas de séquence de caractères, définie par les normes C ou C++, pour le positionnement du curseur ou le déplacement du curseur vers le haut d'une ligne (ou vers des tampons de texte précédents). Il n'existe pas non plus de caractère de contrôle ASCII pour le déplacement du curseur ou le retour en arrière d'une ligne.
Cela vient de l'histoire où certains périphériques de sortie ne pouvaient pas enrouler le papier en arrière et retaper sur le papier. Souvent, le papier provoquait un bourrage et le papier pouvait être enroulé suffisamment loin pour que quelqu'un doive le réenfiler.
Il n'y a pas de comportement standard défini pour le cas où un retour arrière est rencontré au début d'une ligne. Certains périphériques de sortie l'ignorent. D'autres vont à la fin de la ligne précédente. Lorsque le retour arrière se trouve dans le coin supérieur gauche de l'écran, certains terminaux positionnent le curseur dans le coin inférieur droit.
Vous devrez soit "dessiner" d'abord la sortie en mémoire, puis sortir le "miroir" de la mémoire sur le périphérique de sortie, soit trouver un progiciel de positionnement du curseur qui réponde aux besoins de votre (vos) plate-forme(s). L'utilisation d'un système de fenêtrage peut être une autre solution.
- Réponses précédentes
- Plus de réponses