3 votes

Si possible, comment empêcher une impression vers stdout d'interrompre ce qui a été tapé ?

J'ai un client et un serveur de chat en ligne de commande de base en Python, mais cela pourrait s'appliquer à n'importe quel langage. J'ai rencontré un problème très évident, et je ne suis pas sûr qu'il y ait un moyen de le contourner (à part utiliser une interface graphique ! ce qui résoudrait rapidement le problème). Lorsque le serveur envoie un message au client, ce qui amène ce dernier à print() le message, il est inséré à l'endroit exact où la personne serait en train de taper son propre message, ce qui fait qu'il est coupé par le message entrant. Par exemple (écrit sous forme de commentaires # pour éviter une coloration syntaxique bizarre) :

# Client1: Knock-knock!
# Client2: Who's there?
# Client1: Interrupting cow!
# Client2: Inter
# Client1: MOOOOOOO
# Client2: rupting cow who?

Où le client 2 n'a pas appuyé sur la touche entrée depuis qu'il a tapé Who's there? .

Il existe évidemment toutes sortes de solutions de contournement, comme les panneaux d'une interface graphique, mais je suis curieux de savoir s'il est possible d'implémenter cette fonction strictement dans le terminal/interface de commande natif. Je n'ai rien trouvé qui ressemble de près ou de loin à cela lors de mes recherches sur Internet pour trouver une solution ! Merci !

2voto

olamork Points 164

J'utiliserais quelque chose comme https://pypi.python.org/pypi/blessings/ qui vous permet de configurer un terminal avec un curseur.

Vous pouvez déplacer le curseur "vers le haut" lorsque vous souhaitez imprimer la sortie de l'autre connexion, puis le ramener vers le bas lorsque vous souhaitez obtenir l'entrée.

Si vous voulez obtenir fou vous pouvez faire toute cette magie par vous-même avec les commandes de contrôle du terminal (sous Windows, vous aurez besoin de colorama) qui vous permettront de faire des choses comme :

print("\033[6;3HHello")

Ce qui déplace le curseur en x,y. Cela nécessite un terminal ansi.

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