105 votes

Y a-t-il un personnage en ligne ascendante ? (Opposé à \n )

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 ?

155voto

Sven Marnach Points 133943

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.")

11voto

Levon Points 34085

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.

3voto

user7380054 Points 31
for i in range(10):  
    print("Loading" + "." * i) 

    doSomeTimeConsumingProcessing()

    sys.stdout.write("\033[F") # Cursor up one lin

Essayez ceci en Python et remplacez doSomeTimeConsumingProcessing() par n'importe quelle routine nécessaire, en espérant que cela vous aidera.

2voto

Josh P Points 756

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 .

1voto

Thomas Matthews Points 19838

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X