Les touches de fonction et les touches de curseur peuvent également être identifiées. Il n'est pas possible de juger de l'entrée unique de la touche Shift ou de la touche Contrôle, mais la pression simultanée avec la touche de caractère peut être identifiée. Lorsque le masque termios.ISIG est activé, Cntl + C accepte le programme comme entrée clé sans s'arrêter.
point
--Désactiver l'écho dans les termios, désactiver le mode canonique --Réglez en mode NONBLOCK avec fcntl
getkey.py
import fcntl
import termios
import sys
import os
def getkey():
fno = sys.stdin.fileno()
#Récupère l'attribut terminal de stdin
attr_old = termios.tcgetattr(fno)
#Écho stdin désactivé, mode canonique désactivé
attr = termios.tcgetattr(fno)
attr[3] = attr[3] & ~termios.ECHO & ~termios.ICANON # & ~termios.ISIG
termios.tcsetattr(fno, termios.TCSADRAIN, attr)
#Réglez stdin sur NONBLOCK
fcntl_old = fcntl.fcntl(fno, fcntl.F_GETFL)
fcntl.fcntl(fno, fcntl.F_SETFL, fcntl_old | os.O_NONBLOCK)
chr = 0
try:
#Obtenez la clé
c = sys.stdin.read(1)
if len(c):
while len(c):
chr = (chr << 8) + ord(c)
c = sys.stdin.read(1)
finally:
#Annuler stdin
fcntl.fcntl(fno, fcntl.F_SETFL, fcntl_old)
termios.tcsetattr(fno, termios.TCSANOW, attr_old)
return chr
if __name__ == "__main__":
while 1:
key = getkey()
#Quitter avec enter, afficher s'il y a une entrée clé
if key == 10:
break
elif key:
print(key)
Recommended Posts