Как имитировать событие нажатия клавиши в python в другой программе, работающей в python

Я запускаю модель ML, которая предсказывает жесты пальцев. Я пытаюсь смоделировать событие нажатия клавиши в python, используя библиотеку pynput, и я проверяю, что она работает нормально. Но у меня есть другая программа, которая представляет собой игру, написанную на python с использованием библиотеки pygame, которая открывается в новом окне, но проблема в том, что управление нажатием клавиш не работает, но работает, когда я вручную нажимаю кнопки клавиатуры.


person Aviii04    schedule 17.04.2019    source источник
comment
PyGame использует библиотеку SDL (Simple DirectMedia Layer) и, вероятно, может использовать прямой доступ к системным событиям, поэтому он может работать на более низком уровне, чем pynput. Когда я вижу PyGame в обучении с подкреплением, значит, он использует код, созданный только для обучения с подкреплением.   -  person furas    schedule 17.04.2019
comment
Есть ли способ выполнить симуляцию нажатия клавиш на более низком уровне?   -  person Aviii04    schedule 17.04.2019
comment
Есть ли способ выполнить симуляцию нажатия клавиш на этом более низком уровне? Как насчет ctype?   -  person Aviii04    schedule 17.04.2019


Ответы (2)


В pygame вы можете добавлять события в очередь событий, выполнив следующие действия:

newevent = pygame.event.Event(type, **attributes) #create the event
    pygame.event.post(newevent) #add the event to the queue

Где type — тип события (числовая константа), а **attributes — список атрибутов keyarg, а также предопределенные константы.

Все эти константы определены в модуле pygame.locals. документы событий pygame и ключевые документы pygame перечисляют их все.

Итак, если вы хотите имитировать нажатие клавиши «a», например, код будет таким:

newevent = pygame.event.Event(pygame.locals.KEYDOWN, unicode="a", key=pygame.locals.K_a, mod=pygame.locals.KMOD_NONE) #create the event
    pygame.event.post(newevent) #add the event to the queue

KEYDOWN – это константа, соответствующая событию нажатия клавиши.
unicode – это Unicode-представление нажатой клавиши.
key – это константа, связанная с нажатой клавишей.
mod – это константа, представляющая модификатор (если кнопка нажата, например, одновременно с нажатием SHIFT или CAPS_LOCK).

Надеюсь, поможет.

person Valentino    schedule 17.04.2019
comment
Будет ли это работать, если я смоделирую это в одной программе на Python и прослушаю это событие в другой программе? - person Aviii04; 17.04.2019
comment
Этого я не знаю. Попробуйте (и дайте мне знать, мне тоже любопытно). - person Valentino; 17.04.2019
comment
После запуска вышеуказанной команды в pygame следует ли печатать, если я открыл блокнот? - person Aviii04; 18.04.2019
comment
А, теперь я вижу, чего ты хочешь. Нет, не так просто. События Pygame должны прослушиваться событием прослушивателя pygame. Насколько я знаю, они не на уровне ОС. Для этого потребуется перенаправление stdout на stdin другой программы или аналогичный трюк. Я думаю, что pygame не подходит для этого. - person Valentino; 18.04.2019
comment
Я прослушиваю событие с помощью ключей [pygame.K_a] .... но, похоже, оно не работает. Как насчет библиотеки ctype - person Aviii04; 18.04.2019
comment
Может быть. Но я не знаю, как вам в этом помочь, лучше открыть новый вопрос, посвященный использованию библиотеки, которую вы хотите использовать. - person Valentino; 18.04.2019
comment
Я решил проблему, эмулируя событие нажатия клавиши с помощью keyboard.press и прослушивая одно и то же событие с помощью keyboard.Listner(), оба присутствуют в клавиатурной библиотеке. Поэтому я не использовал функции pygame для прослушивания события. Спасибо всем за вашу помощь. - person Aviii04; 20.04.2019

Я решил проблему, эмулируя событие нажатия клавиши с помощью keyboard.press и прослушивая одно и то же событие с помощью keyboard.Listner(), оба присутствуют в клавиатурной библиотеке. Поэтому я не использовал функции pygame для прослушивания события. Спасибо всем за вашу помощь.

person Aviii04    schedule 20.04.2019