0

我编写了一个 python 程序,它使用 gphoto2 来控制我的相机——所以我可以创建一个照相亭。我没有为用户提供键盘或鼠标输入,而是购买了一个 xin-mo 控制器,这样我就可以提供一个简单的街机风格按钮界面(拍照、拒绝照片、接受照片等)。

python 程序是使用 Tkinter 编写的,我使用 evdev 从 xin-mo 读取输入事件。我用于 xin-mo 事件的代码是这样的:-

while True:

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

它可以工作,按下按钮时我可以做一些事情。

我不知道如何让 evdev 和 Tkinter 一起工作。根据我的发现,我需要调用 mainloop 来呈现 GUI ......但是一旦在 mainloop 中,我如何从 xin-mo 控制器读取输入事件?

我对 python 很陌生,所以我很可能遗漏了一些明显的东西。

谢谢,史蒂夫。

4

1 回答 1

0

只要 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()

注意:如果轮询花费的时间超过几百毫秒,则会导致您的 GUI 滞后。如果是这种情况,您可能需要在单独的线程中进行轮询。

于 2015-04-10T19:14:05.780 回答