web-dev-qa-db-fra.com

Python pour lire les touches)?

Je suis nouveau dans Python et je viens de créer un jeu et un menu en Python. La question est que, pour utiliser (raw_) input (), il faut que j'appuie sur entrée après chaque pression sur une touche. J'aimerais faire en sorte que vous appuyiez sur la flèche du bas pour sélectionner instantanément l'élément de menu suivant ou pour vous déplacer vers le bas dans le jeu. Pour le moment, il faut que j'aime taper "down" puis appuyer sur entrée. J'ai également effectué de nombreuses recherches, mais je préférerais ne pas télécharger d'énormes modules (par exemple, pygame) simplement pour obtenir une méthode unique KeyDown (). Alors, y a-t-il des moyens plus simples que je ne trouvais tout simplement pas?

Edit: Je viens de découvrir que msvcrt.getch() ferait l'affaire. Ce n'est pas keyDown (), mais ça fonctionne. Cependant, je ne suis pas sûr de savoir comment l'utiliser non plus, cela semble assez étrange, aucune aide ici? Voici ce que j'ai en ce moment:

from msvcrt import getch
while True:
    key = getch()
    print(key)

Cependant, il continue à me donner tous ces octets sans signification, par exemple, la flèche vers le bas est la suivante:

b'\xe0'
b'P'

Et je ne sais pas comment les utiliser, j'ai essayé de comparer avec chr () et même d'utiliser ord () mais je ne peux pas vraiment faire de comparaison. Ce que j'essaie de faire est essentiellement ceci:

from msvcrt import getch
while True:
    key = getch()
    if key == escape:
        break
    Elif key == downarrow:
        movedown()
    Elif key == 'a':
        ...

Et ainsi de suite ... Une aide?

43
user1632861

Je l'ai compris en testant tout par moi-même. Je n'ai trouvé aucun sujet à ce sujet, alors je vais laisser la solution ici. Ce n'est peut-être pas la solution unique ni même la meilleure, mais cela fonctionne pour mes besoins (dans les limites de getch) et vaut mieux que rien.

Remarque: la fonction keyDown() appropriée, qui reconnaît toutes les touches et les touches utilisées, est toujours valorisée.

Solution: utiliser ord()- pour transformer d'abord la getch() en un entier (je suppose que ce sont des codes de clé virtuels, mais pas trop sûrs) fonctionne bien , puis en comparant le résultat au nombre réel représentant la clé recherchée. De plus, si j'en avais besoin, je pourrais ajouter un chr() supplémentaire autour du nombre renvoyé afin qu'il le convertisse en un caractère. Cependant, je me sers surtout de la flèche vers le bas, esc, etc. Voici le code final:

from msvcrt import getch
while True:
    key = ord(getch())
    if key == 27: #ESC
        break
    Elif key == 13: #Enter
        select()
    Elif key == 224: #Special keys (arrows, f keys, ins, del, etc.)
        key = ord(getch())
        if key == 80: #Down arrow
            moveDown()
        Elif key == 72: #Up arrow
            moveUp()

De plus, si quelqu'un d'autre en a besoin, vous pouvez facilement trouver les codes clés à partir de Google ou en utilisant python et en appuyant simplement sur la touche:

from msvcrt import getch
while True:
    print(ord(getch()))
59
user1632861

Voir le MSDN getch docs. Plus précisément:

Les fonctions _getch et_getwch lisent un seul caractère de la console sans lui faire écho. Aucune de ces fonctions ne peut être utilisée pour lire CTRL + C. Lors de la lecture d'une touche de fonction ou d'une touche fléchée, chaque fonction doit être appelée deux fois; le premier appel renvoie 0 ou 0xE0 et le second appel renvoie le code de clé actuel.

La fonction Python renvoie un caractère. Vous pouvez utiliser ord() pour obtenir un entier que vous pouvez tester, par exemple keycode = ord(msvcrt.getch()).

Donc, si vous lisez 0x00 ou 0xE0, lisez-le une seconde fois pour obtenir le code de clé pour une flèche ou une touche de fonction. Par expérimentation, 0x00 précède F1-F10 (0x3B-0x44) et 0xE0 précède les touches fléchées et Ins/Del/Home/End/PageUp/PageDown.

10
Mark Tolonen

Je ne voulais vraiment pas poster ceci en tant que commentaire car je devrais commenter toutes les réponses et la question initiale.

Toutes les réponses semblent s'appuyer sur MSVCRT Microsoft Visual C Runtime. Si vous souhaitez éviter cette dépendance:

Si vous souhaitez un support multi-plateforme, utilisez la bibliothèque ici:

https://pypi.org/project/getkey/#files

https://github.com/kcsaff/getkey

Peut permettre une solution plus élégante.

Exemple de code:

from getkey import getkey, keys
key = getkey()
if key == keys.UP:
  ...  # Handle the UP key
Elif key == keys.DOWN:
  ...  # Handle the DOWN key
Elif key == 'a':
  ...  # Handle the `a` key
Elif key == 'Y':
  ...  # Handle `shift-y`
else:
  # Handle other text characters
  buffer += key
  print(buffer)
1
Ken
from msvcrt import getch

pos = [0, 0]

def fright():
    global pos
    pos[0] += 1

def fleft():
    global pos 
    pos[0] -= 1

def fup():
    global pos
    pos[1] += 1

def fdown():
    global pos
    pos[1] -= 1

while True:
    print'Distance from zero: ', pos
    key = ord(getch())
    if key == 27: #ESC
        break
    Elif key == 13: #Enter
        print('selected')
    Elif key == 32: #Space
        print('jump')
    Elif key == 224: #Special keys (arrows, f keys, ins, del, etc.)
        key = ord(getch())
        if key == 80: #Down arrow
            print('down')
            fdown
        Elif key == 72: #Up arrow
            print('up')
            fup()
        Elif key == 75: #Left arrow
            print('left')
            fleft()
        Elif key == 77: #Right arrow
            print('right')
            fright()
1
Tommy L