python detecter - Trouver les valeurs des touches fléchées en Python: Pourquoi sont-elles triples?




1 Answers

Je pense que je l'ai compris.

J'ai appris here que chaque touche fléchée est représentée par un code d'échappement ANSI unique. Ensuite, j'ai appris que les codes d'échappement ANSI varient selon le système et l'application: dans mon terminal, frapper le cat et appuyer sur la flèche vers le haut donne ^[[A , en C, il semble être \033[A , etc.] [A reste le même, mais le code de l’ Escape précédente peut être en hexadécimal (commençant par x), octal (commençant par 0) ou décimal (pas de numéro de piste).

Ensuite, j'ai ouvert la console python et branché les triples que j'avais précédemment reçus, essayant de trouver leurs valeurs de caractères. Comme il s'est avéré, chr(27) donné \x1b , chr(91) donné [ , et l'appelant chr de 65,66,67,68 renvoyé respectivement A,B,C,D Alors c'était clair: \x1b était le code d'échappement!

Ensuite, j'ai remarqué qu'une touche fléchée, en ANSI, représentée par un triple, est bien sûr représentée par trois caractères. Il fallait donc modifier mon code pour pouvoir lire trois caractères à la fois. Voici le résultat:

import sys,tty,termios
class _Getch:
    def __call__(self):
            fd = sys.stdin.fileno()
            old_settings = termios.tcgetattr(fd)
            try:
                tty.setraw(sys.stdin.fileno())
                ch = sys.stdin.read(3)
            finally:
                termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
            return ch

def get():
        inkey = _Getch()
        while(1):
                k=inkey()
                if k!='':break
        if k=='\x1b[A':
                print "up"
        elif k=='\x1b[B':
                print "down"
        elif k=='\x1b[C':
                print "right"
        elif k=='\x1b[D':
                print "left"
        else:
                print "not an arrow key!"

def main():
        for i in range(0,20):
                get()

if __name__=='__main__':
        main()
clavier tkinter

J'essaie de trouver les valeurs que mon système local attribue aux touches fléchées, en particulier en Python. J'utilise le script suivant pour faire ceci:

import sys,tty,termios
class _Getch:       
    def __call__(self):
            fd = sys.stdin.fileno()
            old_settings = termios.tcgetattr(fd)
            try:
                tty.setraw(sys.stdin.fileno())
                ch = sys.stdin.read(1)
            finally:
                termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
            return ch

def get():
    inkey = _Getch()
    while(1):
            k=inkey()
            if k!='':break
    print 'you pressed', ord(k)

def main():
    for i in range(0,25):
        get()

if __name__=='__main__':
    main()

Ensuite, j'ai exécuté le script et appuyé sur UP DOWN RIGHT LEFT, ce qui m'a donné cette sortie:

$ python getchar.py 
you pressed 27
you pressed 91
you pressed 65
you pressed 27
you pressed 91
you pressed 66
you pressed 27
you pressed 91
you pressed 67
you pressed 27
you pressed 91
you pressed 68

Ceci est anormal car cela suggère que les touches fléchées sont enregistrées sous forme de triples (27-91-6x) sur mon système, car chaque pression sur une touche fléchée prend trois instances de get (). En comparaison, appuyer sur a, b, c et CTRL-C donne:

you pressed 97
you pressed 98
you pressed 99
you pressed 3

Quelqu'un peut-il m'expliquer pourquoi les valeurs de mes touches fléchées semblent être stockées en triplets? Pourquoi est-ce vrai? Est-ce la même chose sur toutes les plateformes? (J'utilise Linux Debian.) Sinon, comment dois-je procéder pour stocker les valeurs des touches fléchées?

L'objectif final est que j'essaie d'écrire un programme qui doit reconnaître correctement les touches fléchées et exécuter une fonction en fonction de la touche fléchée sur laquelle vous avez appuyé.




Related