Использование evdev и tkinter в программе на Python

Я написал программу на Python, которая использует gphoto2 для управления моей камерой, поэтому я могу создать фотобудку. Вместо того, чтобы предлагать пользователю клавиатуру или мышь для ввода, я купил контроллер xin-mo, чтобы я мог предоставить простой кнопочный интерфейс в аркадном стиле (сделать фото, отклонить фото, принять фото и т. д.).

Программа на python написана с использованием Tkinter, и я использую evdev для чтения входных событий из xin-mo. Код, который я использую для событий xin-mo, выглядит так:

while True:

  for ev in device.read():
    print("Take photo")

Это работает, и я могу что-то делать, когда кнопки нажаты.

Чего я не могу понять, так это того, как заставить evdev и Tkinter работать вместе. Из того, что я обнаружил, мне нужно вызвать mainloop для рендеринга графического интерфейса... но как мне в mainloop читать входные события с контроллера xin-mo??

Я очень новичок в python, поэтому я вполне могу упустить что-то очевидное.

Спасибо, Стив.


person Steve    schedule 10.04.2015    source источник


Ответы (1)


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

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

root = tk.Tk()
...
def poll_evdev():
    for ev in device.read():
        print("Take photo")
    # schedule the polling to occur every 100 ms
    root.after(100, poll_evdev)
...
# start the polling process
poll_evdev()

# start the GUI event loop
root.mainloop()

Примечание: если опрос занимает более нескольких сотен миллисекунд, это приведет к задержке вашего графического интерфейса. В этом случае вам может потребоваться провести опрос в отдельном потоке.

person Bryan Oakley    schedule 10.04.2015
comment
Спасибо за код, я пытался использовать его в своей программе. К сожалению, это сработало только для нескольких событий, а затем сообщило, что устройство не готово. В итоге я разобрал старую клавиатуру и припаял провода от аркадных кнопок к печатной плате. Это означает, что теперь у меня есть ввод с клавиатуры... так что я могу перехватывать их. Еще раз спасибо за код. - person Steve; 12.04.2015