Почему pynput не обнаруживает нажатия клавиш на клавиатуре? - PullRequest
0 голосов
/ 09 февраля 2019

Я использую Python 3.7 на Windows 7.

Есть ли способ обнаружить нажатия клавиш (например: "1") в модуле pynput?

Я пробовал многодругие модули, и у меня ничего нет, кроме tkinter, которому нужно окно, но я не хочу этого.

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

На самом деле он только печатает нажатую клавишу и никогда не тормозит (не принимает числовой ввод).

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Ваш код проверяется на значение "1".Это ваше прощение за то, что вы заявили очевидное, что возвращает pynput, если вы нажмете клавишу 1.Вы хотите ответить на клавишу NumLock.

Вместо

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

вы можете кодировать любой из этих тестов, оба из которых проверяют значение, которое вы ищете:

if key == keyboard.Key.num_lock:

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

Но ... Есть два вида клавиш NumLock.

Один из них - Клавиатура NumLock and Clear , которая имеет как код USB (0x53), так и код виртуальной клавиши Windows (0x90).pynput будет реагировать на нажатие этой клавиши.

Другой тип Блокировка клавиатуры NumLock , которая работает на уровне клавиатуры: она меняет поведение вашей клавиатуры, а Windows не получаетслышать об этом.Он имеет код USB (0x83), но не имеет кода виртуальной клавиши Windows.Если для клавиши нет кода виртуальной клавиши, не будет сообщения Windows для его нажатия, и pynput сообщает о сообщениях Windows.

Таким образом, это зависит от аппаратного обеспечения и можетМашина имеет второй вид NumLock ключ.Если это произойдет, то ничего, что вы можете сказать pynput, не поможет.Это маловероятно, если только вы не работаете с очень ограниченной клавиатурой ноутбука.

0 голосов
/ 11 февраля 2019

Код, который вы указали, похоже, пытается определить цифровой ключ '1', а не 'Num lock'.

@ BoarGules предоставил полный ответ.Просто для пояснения:

Когда вы контролируете клавиатуру с помощью pynput, при попытке обнаружить управляющую клавишу вы должны сравнить ее с соответствующим объектом pynput.keyboard.Key.В случае проверки на num lock ваш код должен выглядеть следующим образом:

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

С другой стороны, если вы ищете буквенно-цифровой ключ, сравните его с pynput.keyboard.KeyCode:

if key == keyboard.KeyCode(char = '1'):
    print('exiting')
0 голосов
/ 09 февраля 2019

Быстрый взгляд на документ показывает, что на некоторых платформах ключ блокировки num может быть не определен.К сожалению, у меня нет машины с Windows, чтобы проверить это.

num_lock = <Key.f1: 0>

Клавиша NumLock.Это может быть неопределенным для некоторых платформ.

...