Détecter les frappes en Python (sans Entrée)

[Une addition] version tty

Si vous utilisez normalement input () ou sys.stdin.read (),

  1. Entrez les caractères

  2. Appuyez sur Entrée

Deux étapes sont nécessaires.

Je veux que vous fassiez quelque chose au moment où vous appuyez sur la touche, sans appuyer sur Entrée. J'ai essayé de le trouver, mais je ne l'ai pas trouvé, alors j'ai pris note.

Vous pouvez vérifier le fonctionnement sur mac et ubuntu. Cela ne fonctionne pas sous Windows, mais il semble facile de faire la même chose avec le module msvcrt.

import sys
import termios

#Obtenir un descripteur de fichier d'entrée standard
fd = sys.stdin.fileno()

#Obtenez les attributs de terminal de fd
#La même chose est entrée dans l'ancien et le nouveau.
#Apportez des modifications au nouveau et adaptez-vous
#l'ancien doit être restauré plus tard
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)

#new[3]Est-ce que lflags
#ICANON(Indicateur de mode canonique)Retirer
new[3] &= ~termios.ICANON
#ECHO(Drapeau pour afficher les caractères saisis)Retirer
new[3] &= ~termios.ECHO


try:
    #Appliquer le nouveau réécrit à fd
    termios.tcsetattr(fd, termios.TCSANOW, new)
    #Recevez les entrées du clavier.
    #Puisque lfalgs a été réécrit, vous pouvez passer au suivant sans appuyer sur Entrée. Ne fais pas écho
    ch = sys.stdin.read(1)
    
finally:
    #Restaurer les attributs de fd
    #Plus précisément, ICANON et ECHO sont restaurés
    termios.tcsetattr(fd, termios.TCSANOW, old)

print(ch)

Descripteur de fichier

En premier lieu, l'entrée et la sortie sont gérées à l'aide d'un identifiant appelé descripteur de fichier. http://qiita.com/toshihirock/items/78286fccf07dbe6df38f

En échangeant le descripteur de fichier entre le système d'exploitation et chaque programme, il est possible de se juger s'il s'agit d'une entrée / sortie standard, d'une sortie d'erreur ou d'une entrée / sortie d'un fichier.

termios Termios est le point de contact pour réellement échanger des données avec le système d'exploitation à l'aide du descripteur de fichier. termios a des informations sur la façon d'échanger des données entre le programme et le système d'exploitation. https://linuxjm.osdn.jp/html/LDP_man-pages/man3/termios.3.html

Parmi les informations, il y a aussi un drapeau (mode canonique, ICANON) qui décide s'il faut attendre l'entrée jusqu'à ce que l'entrée soit appuyée ou pour entrer dès que la touche est enfoncée. C'est une dimension que l'entrée clé peut être détectée en jouant avec elle.

À propos, dans l'exemple ci-dessus, l'indicateur (ECHO) qui décide d'afficher ou non les caractères saisis est également falsifié.

référence

À propos des termios. Je connais aussi le mode canonique. https://linuxjm.osdn.jp/html/LDP_man-pages/man3/termios.3.html

termios en python http://docs.python.jp/2/library/termios.html#module-termios

Vous pouvez faire quelque chose de similaire à un niveau plus élevé que les termios appelés tty. Ou plutôt, celui-ci est plus facile. Uniquement disponible sous Unix. http://docs.python.jp/2/library/tty.html#module-tty

J'utilise tty pour créer un joli module http://code.activestate.com/recipes/134892/

Recommended Posts

Détecter les frappes en Python (sans Entrée)
Détecter les frappes en python (tty)
Créez Gmail en Python sans utiliser l'API
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Obtenir des frappes lors de l'exécution en arrière-plan en Python (Windows)
Détecter le graphique boursier Golden Cross avec Python
Vous permet de saisir des parenthèses et des valeurs égales fréquemment utilisées en python sans Shift
Liste triée en Python
Texte de cluster en Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 6 en Python
Daily AtCoder # 18 en Python
Modifier les polices en Python
Motif singleton en Python
Opérations sur les fichiers en Python
Lire DXF avec python
Daily AtCoder # 53 en Python
Séquence de touches en Python
Utilisez config.ini avec Python