Один из вариантов - использовать Python метод select.poll , который позволяет проверить, есть ли в дескрипторе файла какой-либо доступный ввод. Мы могли бы переписать ваш код примерно так:
import select
import pygame
pygame.init()
pygame.display.init()
pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
running = True
poll = select.poll()
with open("/dev/input/js0", "rb") as f:
poll.register(f, select.POLLIN)
while running:
events = poll.poll(0)
if events:
event = f.read(8)
print('FLIP!')
pygame.display.flip()
clock.tick(30)
pygame.quit()
Для получения дополнительной информации поищите статьи о «non-blocking io» с помощью Python.
В качестве альтернативы вы можете использовать Код обработки событий в Pygame, а не чтение непосредственно из /dev/input/js0
. Например:
import pygame
pygame.init()
pygame.joystick.init()
pygame.display.init()
pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
js = pygame.joystick.Joystick(0)
js.init()
running = True
while running:
event = pygame.event.poll()
if event.type == pygame.QUIT:
break
if event.type == pygame.JOYHATMOTION:
print('FLIP!')
pygame.display.flip()
clock.tick(30)
pygame.quit()
Приведенный выше код будет реагировать только на нажатие, но вы также можете легко расширить его для прослушивания действий осей и кнопок.