Постоянное прослушивание файла устройства linux в Python3 - PullRequest
0 голосов
/ 24 апреля 2020

Я использую файлы устройств для чтения записей с функциями open() и f.read(), но проблема в том, что read() не останавливается, пока не появится новая запись. Поэтому я не могу позволить моей программе делать что-либо еще ...

running = True

with open("/dev/input/js0", "rb") as f:
    while running:

        event = f.read(8)

        pygame.display.flip()
        clock.tick(30)

pygame.quit()

Например, здесь я могу нарисовать окно только при использовании устройства.

Спасибо за чтение.

1 Ответ

1 голос
/ 25 апреля 2020

Один из вариантов - использовать 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()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...