pygame.event.get() не возвращает никаких событий внутри потока

#python #pygame #multiprocessing

#python #python-3.x #pygame

Вопрос:

Итак, у меня есть этот код, который следит за пользовательскими вводами для игры в стиле pac-man.

 def receiving_inputs(self):
    while True:
        events = pg.event.get()
        for event in events:
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_UP:
                    self.move = 'n'
                elif event.key == pg.K_RIGHT:
                    self.move = 'e'
                elif event.key == pg.K_DOWN:
                    self.move = 's'
                elif event.key == pg.K_LEFT:
                    self.move = 'w'
        time.sleep(1/60)

threading.Thread(target=self.receiving_inputs).start()
 

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

Раздражает то, что этот точный код отлично работает, когда он не в потоке. т.е. Когда в основном цикле программы.

К вашему сведению, я хочу использовать здесь поток, чтобы свести к минимуму количество раз, когда pygame не регистрирует нажатие клавиши (что, я предполагаю, связано с другими вещами в mainloop).

Заранее спасибо.

Ответ №1:

Вы вообще не получаете никаких событий, потому что вам нужно получать события в основном потоке.
Смотрите Документацию pygame.event :

[…] Подсистема событий должна вызываться из основного потока.

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

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

1. Это имеет большой смысл, но почему я все еще получаю события мыши?

2. Я понятия не имею, что вызывает такое поведение. В документации просто говорится: «Подсистема событий должна вызываться из основного потока». — так что, если вы выполняете обработку событий в потоке, тогда поведение не определено и, вероятно, зависит от системы.