Заменить пользовательские ключи с помощью pynput

Я пытаюсь написать программу, используя библиотеку pynput, которая отслеживает нажатие клавиши пользователя и когда пользователь нажимает клавишу со специальным символом, например: # моя программа сразу после этого нажимает другую клавишу. Например, когда пользователь нажимает знак $, программа нажимает левую клавишу сразу после этого, и курсор перемещается на один символ за знаком $. Моя проблема в том, что для ввода знака $ пользователь нажимает SHIFT + 5, и в большинстве случаев пользователь отпускает только цифровую клавишу, а клавиша Shift остается нажатой. В этом случае, когда моя программа нажимает левую клавишу, вставка нажатия только левой клавиши, нажимается SHIFT + левая клавиша, что вызывает маркировку символа вместо перемещения влево. Я хотел бы знать, можно ли игнорировать пользовательский ключ или каким-либо образом его переопределить. Цените вашу помощь. Спасибо

from pynput.keyboard import Key, Listener, Controller
import re

keyboard = Controller()
REGEX = re.compile('[@_!#$%^&*()<>?/\|}{~:]')

def on_press(key):
    try:
        if key != Key.left:
            if REGEX.search(key.char) != None:
                keyboard.press(Key.left)
                keyboard.release(Key.left)
                print("I pressed left for you")
        else:
            print("Nothing")
    except Exception as e:
        print(e)

with Listener(on_press=on_press) as listener:
    listener.join()

person AriG    schedule 22.05.2020    source источник


Ответы (1)


Вы можете выпустить Shift, они делают, что хотите. На всякий случай, если пользователь хочет продолжить, нажмите специальный символ, также нажмите shift после того, как вы закончили работу.

Итак, ваш код может быть:

from pynput.keyboard import Key, Listener, Controller
import re

keyboard = Controller()
REGEX = re.compile('[@_!#$%^&*()<>?/\|}{~:]')

def on_press(key):
    try:
        if key != Key.left:
            if REGEX.search(key.char) != None:
                keyboard.release(Key.shift) # release
                keyboard.press(Key.left) # your work
                keyboard.release(Key.left)
                keyboard.press(Key.shift) # also keep pressed
                print("I pressed left for you")
        else:
            print("Nothing")
    except Exception as e:
        print(e)

with Listener(on_press=on_press) as listener:
    listener.join()
person jizhihaoSAMA    schedule 23.05.2020
comment
Я пробовал ваш код, но похоже, что keyboard.release (Key.shift) не отпускает сдвиг, нажатый пользователем. Вы используете MAC? может быть разница в поведении. - person AriG; 27.05.2020
comment
Сдвиг останется нажатым, но пользователь все равно может оставить его нажатым, так что это не сработает. - person AriG; 28.05.2020