Trouver les Valeurs des Touches Fléchées en Python: Pourquoi sont-ils triples?

Je suis en train d'essayer de trouver les valeurs que mon système local attribue à l'aide des touches fléchées, plus précisément en Python. J'utilise le script suivant pour ce faire:

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()

Puis j'ai exécuté le script, et de frapper en BAS à DROITE à GAUCHE, ce qui m'a donné ce résultat:

$ 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

C'est anormal, car elle suggère que les touches de direction sont enregistrés sous la forme d'une triple (27-91-6x) sur mon système, comme chaque pression sur une touche de direction prend les trois instances de get(). Par comparaison, en appuyant 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 ma flèche-clés semblent être stockées sous forme de triplets? Pourquoi est-ce si? Est-ce le même sur toutes les plateformes? (Je suis sous Linux Debian.) Si non, comment dois-je stocker les valeurs de la flèche-clés?

Le but ici est que je suis en train d'écrire un programme qui a besoin de reconnaître correctement aide des touches fléchées et d'effectuer une fonction de fonction de flèche touche a été pressée.

  • Je dirais code d'échappement ANSI même si ça manque clairement une section sur les codes d'échappement qui sont envoyés par le clavier; leur format est le même que ceux qui sont envoyés à partir de programmes pour le terminal.
  • Cela paraît utile: stackoverflow.com/questions/4130048/...
  • Pourquoi avez-vous un _Getch classe avec un __call__ méthode au lieu de seulement un getch fonction?
  • parce que j'ai besoin de faire appel à une instance de celle-ci? Il ne fonctionne pas comme une fonction.
  • Il fonctionne parfaitement comme une fonction. Il suffit de tourner la __call__ méthode dans un niveau supérieur getch la fonction, supprimer la self paramètre, et d'appeler getch() au lieu de créer un inkey instance et d'appel inkey(). Même si vous devez passer autour d'un objet, vous pouvez le faire avec un getch fonction directement.
  • Il ressemble à la source d'origine-vous tiré de cette de besoin de faire quelques initialisation de travail afin de déterminer la mise en œuvre qu'à utiliser. Vous avez enlevé les OS de détection de travail et tout l'équipement nécessaire pour la soutenir, si une classe n'est plus nécessaire.
  • J'ai fait exactement cela, et il ne fonctionne pas pour moi; si je fait une erreur quelque part.
  • Vous avez fait une erreur quelque part. Je ne sais pas ce que l'erreur a été, mais il devrait avons travaillé.
  • Vous avez raison. Je l'ai eu à travailler.

InformationsquelleAutor Newb | 2014-03-14