1
votes

Pourquoi pynput ne détecte pas les pressions sur le clavier numérique?

J'utilise python 3.7 sur Windows 7.

Y a-t-il un moyen de détecter les pressions sur les touches numériques (par exemple: "1") dans le module pynput?

J'ai essayé de nombreux autres modules et je n'ai rien à part tkinter qui a besoin d'une fenêtre mais je ne veux pas de ça.

from pynput import keyboard  
def on_press(key):
     print(key)
     if str(format(key)) == 'Key.1':
         print('Exiting...')
         return False 
with keyboard.Listener(on_press = on_press) as listener:
     listener.join()

Il n'imprime en fait que la touche enfoncée et ne freine jamais (n'accepte pas l'entrée numérique). p >


0 commentaires

3 Réponses :


0
votes

Un rapide coup d'œil à la doc montre que le La touche de verrouillage numérique peut être indéfinie sur certaines plates-formes. Je n'ai malheureusement pas de machine Windows pour tester cela.

num_lock = <Key.f1: 0>

La touche Verr Num. Cela peut être indéfini pour certaines plates-formes.


0 commentaires

4
votes

Votre code teste la valeur "1" . C'est, pardon de dire l'évidence, ce que pynput renvoie si vous appuyez sur la touche 1 . Vous voulez répondre à la touche NumLock .

Au lieu de

if key == keyboard.Key.num_lock:

if str(format(key)) == "Key.num_lock":

, vous pouvez coder l'un ou l'autre de ces tests, qui vérifient tous les deux la valeur que vous recherchez:

if str(format(key)) == '1':

Mais ... Il existe deux types de clé NumLock .

L'un est Keyboard NumLock and Clear qui a à la fois un code USB (0x53) et un code de touche virtuelle Windows (0x90). pynput répondra en appuyant sur cette touche.

L'autre type est Verrouillage du clavier NumLock qui fonctionne au niveau du clavier: il change le comportement de votre clavier , et Windows n’en entend pas parler. Il a un code USB (0x83), mais il n'a pas de code de clé virtuelle Windows. S'il n'y a pas de code de touche virtuelle pour la touche, il n'y aura pas de message Windows pour appuyer dessus, et pynput signale les messages Windows.

Le comportement dépend donc du matériel et il se peut que votre machine dispose du deuxième type de clé NumLock . Si c'est le cas, rien de ce que vous pouvez dire à pynput ne vous aidera. Cela est peu probable, cependant, à moins que vous ne travailliez avec un clavier d'ordinateur portable très restreint.


1 commentaires

alors que dois-je écrire à la place de ça?



2
votes

Le code que vous avez fourni semble essayer de détecter la touche numérique «1» plutôt que «Verr Num».

@BoarGules a fourni une réponse complète. Juste pour ajouter un peu de clarification:

Lorsque vous surveillez le clavier en utilisant pynput, si vous essayez de détecter une touche de contrôle, vous devriez la comparer avec l'objet pynput.keyboard.Key approprié. En cas de vérification du verrouillage numérique, votre code devrait ressembler à ceci:

if key == keyboard.KeyCode(char = '1'):
    print('exiting')

D'un autre côté, si vous recherchez une clé alphanumérique, comparez-la avec pynput.keyboard.KeyCode:

if key == keyboard.Key.num_lock:
    print('exiting')


0 commentaires