windows msvcrt - Méthode Python pour la lecture de keypress?




install keyboard (4)

Je l'ai compris en testant tous les trucs 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 seule ou même la meilleure solution, mais cela fonctionne pour mes fins (dans les limites de getch) et vaut mieux que rien.

Note: keyDown() correct qui reconnaîtrait toutes les touches et les pressions sur les touches, est toujours évalué.

Solution: utiliser la fonction ord() pour transformer le getch() en entier (je suppose que ce sont des codes de touches virtuelles, mais pas trop sûrs) fonctionne correctement, puis comparer le résultat au nombre réel représentant la clé recherchée. De plus, si j'en avais besoin, je pourrais ajouter un peu de chr() autour du nombre retourné afin qu'il le convertisse en caractère. Cependant, j'utilise principalement la flèche vers le bas, l'esc, etc, donc convertir ces caractères en un personnage serait stupide. 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()

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

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

Je suis nouveau sur Python, et je viens de créer un jeu et un menu en Python. La question est, qu'utiliser (raw_) input () m'oblige à appuyer sur enter après chaque pression de touche, je voudrais faire en sorte qu'appuyer sur arrow-down sélectionnera instantanément l'élément de menu suivant, ou descendra dans le jeu. Pour l'instant, il me faut aimer le type "down" puis appuyer sur enter. J'ai aussi fait pas mal de recherches, mais je préfèrerais ne pas télécharger d'énormes modules (par exemple pygame) juste pour obtenir une seule méthode keyDown (). Alors, y a-t-il des moyens plus faciles que je n'ai pas pu trouver?

Edit: J'ai juste découvert que msvcrt.getch() ferait l'affaire. Ce n'est pas keyDown (), mais cela fonctionne. Cependant, je ne suis pas sûr de savoir comment l'utiliser non plus, cela semble assez bizarre, de l'aide ici? C'est ce que j'ai eu en ce moment:

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

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

b'\xe0'
b'P'

Et je n'ai aucune idée de comment les utiliser, j'ai essayé de comparer avec chr () et même utiliser ord () mais je ne peux pas 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 ... Toute aide?


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

Voir les documentations MSDN getch . Plus précisément:

Les fonctions _getch et_getwch lisent un seul caractère de la console sans répercuter le caractère. 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 deuxième appel renvoie le code de clé actuel.

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

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


En Python, vous pouvez y parvenir de deux manières simples:

La manière pythonique: utiliser le mot-clé 'in' de Python

in prend deux "arguments", un à gauche ( sous-chaîne ) et un à droite, et renvoie True si l'argument de gauche est contenu dans l'argument rightide et sinon, renvoie False .

example_string = "This is an example string"
substring = "example"
print(substring in example_string)

Sortie:

True

La méthode non-Pythonique: Utilisation de str.find de Python:

La méthode find renvoie la position de la chaîne dans la chaîne ou -1 si elle n’est pas trouvée. Mais vérifiez simplement si la position n'est pas -1.

if example_string.find(substring) != -1:
    print('Substring found!')
else:
    print('Substring not found!')

Sortie:

Substring found!




python windows key keydown getch