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

#python-3.x #pygame #pynput

#python-3.x #pygame #pynput

Вопрос:

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

Комментарии:

1. PyGame использует SDL-библиотеку (простой DirectMedia Layer) и, вероятно, может использовать прямой доступ к системным событиям, поэтому он может работать на более низком уровне, чем pynput. Когда я вижу PyGame в обучении с подкреплением, он использует код, созданный только для обучения с подкреплением

2. Есть ли какой-либо способ выполнить симуляцию нажатия клавиши на более низком уровне.?

3. Есть ли какой-либо способ выполнить симуляцию нажатия клавиши на этом более низком уровне? Как насчет ctype?

Ответ №1:

В 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 event docs и pygame key docs перечисляют их все.

Итак, если вы хотите имитировать нажатие клавиши «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 — это константа, соответствующая событию keydown.
unicode это представление в Юникоде нажатой клавиши.
key является константой, связанной с нажатой клавишей.
mod является константой, представляющей модификатор (например, если кнопка нажата при нажатии SHIFT или CAPS_LOCK).

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

Комментарии:

1. Будет ли это работать, если я смоделирую это в одной программе на python и прослушаю это событие в другой программе?

2. Этого я не знаю. Попробуйте (и дайте мне знать, мне тоже любопытно).

3. После выполнения приведенной выше команды в pygame, должна ли она печатать «a», если я открыл блокнот?

4. А, теперь я понимаю, чего ты хочешь. Нет, это не так просто. События Pygame должны прослушиваться событием прослушивателя pygame. Насколько я знаю, они не на уровне ОС. Для достижения этого потребуется перенаправление стандартного вывода на стандартный идентификатор другой программы или аналогичный трюк. Я думаю, что pygame не подходит для этого.

5. Я прослушиваю событие с помощью клавиш [pygame.K_a] …. но, похоже, это не работает. Как насчет библиотеки ctype

Ответ №2:

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