我最近在 pyglet-users 小组中问了这个问题,但得到了回复,所以我在这里尝试。
我想扩展 Pyglet,以便能够使用 lirc 支持的红外输入设备。我以前曾将 pyLirc ( http://pylirc.mccabe.nu/ ) 与 PyGame 一起使用过,我想重写我的应用程序以改用 Pyglet。
要查看是否按下了按钮,您通常会轮询 pyLirc 以查看其队列中是否有任何按钮被按下。
我的问题是,在 Pyglet 中集成 pyLirc 的正确方法是什么?
我希望它能以与当前窗口键盘/鼠标事件相同的方式工作,但我不知道从哪里开始。
我知道我可以创建一个新的 EventDispatcher,在其中我可以注册新类型的事件并在轮询后分派它们,如下所示:
class pyLircDispatcher(pyglet.event.EventDispatcher): def poll(self): codes = pylirc.nextcode() if codes is not None: for code in codes: self.dispatch_event('on_irbutton', code) def on_irbutton(self, code): pass
但是,如果我使用 pyglet.app.run(),我该如何将其集成到应用程序的主循环中以继续调用 poll(),以及如何将此事件调度程序附加到我的窗口,以使其与鼠标和键盘调度程序一样工作?
我发现我可以设置一个调度程序,使用 pyglet.clock.schedule_interval 定期调用 poll(),但这是正确的方法吗?
对于原帖作者来说可能已经太晚了,但无论如何我都会回复,希望它对其他人有帮助。
创建事件调度程序并使用 pyglet.clock.schedule_interval 定期调用 poll() 是一种很好的方法。
要将事件调度程序附加到窗口,您需要创建调度程序的一个实例,然后调用其push_handlers方法:
dispatcher.push_handlers(window)
然后,您就可以像对待进入窗口的任何其他事件一样对待这些事件。