Проблема с клавишами со стрелками в библиотеке Python - PullRequest
0 голосов
/ 03 марта 2019

Я писал скрипт, который делает снимок экрана и декодирует определенные нажатия клавиш в названии изображения, как показано ниже.Моя проблема в том, что когда я нажимаю стрелку влево на клавиатуре, нажимается также цифра 4.Я не могу найти что-либо в Google или в документации библиотеки клавиатуры, любые предложения будут отличными.Я использую Windows и Python 3.6.5

(75,)
left arrow pressed
(5, 75)
4 pressed

То же самое происходит со стрелкой вниз, но с числом 3

(80,)
down arrow pressed
(3, 80)
2 pressed

Код

from PIL import ImageGrab
import keyboard  # using module keyboard
import time

keys = [
    "down arrow",
    "up arrow",
    "left arrow",
    "right arrow",
    "w",
    "s",
    "a",
    "d",
    "1",
    "2",
    "3",
    "4",
    "q",
    "e",
    "f"
]

if __name__ == "__main__":
    while True:
        code = []
        try:
            for key in keys:
                if keyboard.is_pressed(key):
                    print(keyboard.key_to_scan_codes(key))
                    print(f"{key} pressed")
                    code.append(1)
                else:
                    code.append(0)

            if keyboard.is_pressed('esc'):
                print(key + " pressed")
                break

            c = "".join(map(str, code))
            snapshot = ImageGrab.grab()
            save_path = str(int(time.time()*1000)) + "-" + c + ".jpg"
            snapshot.save("tmp\\" + save_path)

        except:
            break

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Модуль keyboard имеет простые решения для подобных случаев: они используют активацию event-triggered вместо polling, как используется в вашей попытке.

пример кода:

import keyboard

def handleLeftKey(e):
    if keyboard.is_pressed("4"):
        print("left arrow was pressed w/ key 4")
        # work your magic

keyboard.on_press_key("left", handleLeftKey)
# self-explanitory: when the left key is pressed down then do something

keyboard.on_release_key("left", handleLeftKey02)
# also self-explanitory: when the left key is released then do something

# don't use both ...on_release & ...on_press or it will be
# triggered twice per key-use (1 up, 1 down)

Замените приведенный ниже код и измените его в соответствии с вашими потребностями.

if __name__ == "__main__":
    while True:
        code = []
        try:
            for key in keys:
                if keyboard.is_pressed(key):
                    print(keyboard.key_to_scan_codes(key))
                    print(f"{key} pressed")
                    code.append(1)
                else:
                    code.append(0)

Другой, более динамичный подход будет выглядеть так:

import keyboard

keys = [
    "down",
    "up",
    "left",
    "right",
    "w",
    "s",
    "a",
    "d",
    "1",
    "2",
    "3",
    "4",
    "q",
    "e",
    "f"
]

def kbdCallback(e):
    found = False
    for key in keys:
        if key == keyboard.normalize_name(e.name):
            print(f"{key} was pressed")
            found = True
            # work your magic

    if found == True:
        if e.name == "left":
            if keyboard.is_pressed("4"):
                print("4 & left arrow were pressed together!")
                # work your magic

keyboard.on_press(kbdCallback)
# same as keyboard.on_press_key, but it does this for EVERY key

Еще одна проблема, которую я заметил, заключается в том, что вы используете"left arrow" когда он действительно был распознан как "left" (по крайней мере, в моей системе он может отличаться в вашей, но я предполагаю, что вы хотите, чтобы он работал на всех системах, поэтому было бы безопаснее использовать "left" вместо этого)

Последний метод, который вы могли бы использовать, очень статически типизирован и не имеет динамических возможностей, но сработал бы в случае "4+left" или "left+4"

import keyboard

def left4trigger:
    print("the keys were pressed")

keyboard.add_hotkey("4+left", left4trigger)
# works as 4+left or left+4 (all of the examples do)

Вы, кажется, достаточно умен, чтобы понятьостальные оттуда.

0 голосов
/ 04 марта 2019

Может потребоваться сначала отключить кнопку NumLock.У меня есть проблема с нажатием клавиши Shift, когда активен NumLock.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...