【问题标题】:Using evdev and tkinter in a python program在 python 程序中使用 evdev 和 tkinter
【发布时间】:2015-04-10 16:55:09
【问题描述】:

我编写了一个 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 很陌生,所以我很可能遗漏了一些明显的东西。

谢谢,史蒂夫。

【问题讨论】:

    标签: python python-3.x tkinter evdev


    【解决方案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()
    

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

    【讨论】:

    • 感谢代码,我尝试在我的程序中使用它。不幸的是,它仅适用于几个事件,然后报告该设备尚未准备好。最后我拆掉了一个旧键盘并将街机按钮的电线焊接到 PCB 上。这意味着我现在有键盘字母作为输入......所以我可以捕获它们。再次感谢您的代码。
    猜你喜欢
    • 2020-07-12
    • 2013-04-21
    • 2012-10-29
    • 2023-03-25
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多