在Pyglet中创建新的输入事件调度器(红外输入)

1 投票
2 回答
978 浏览
提问于 2025-04-15 13:16

我最近在pyglet-users小组问了这个问题,但没有得到回复,所以我在这里试试。

我想扩展Pyglet,让它能够使用lirc支持的红外输入设备。我之前用过pyLirc(http://pylirc.mccabe.nu/)和PyGame,现在想把我的应用程序重写成使用Pyglet。

通常情况下,要检查一个按钮是否被按下,你会定期查询pyLirc,看看它的队列里有没有按钮按下的记录。

我的问题是,如何在Pyglet中正确地集成pyLirc?

我希望它能像当前窗口的键盘和鼠标事件那样工作,但我不知道从哪里开始。

我知道我可以创建一个新的事件调度器,在里面注册新的事件类型,并在查询后进行分发,像这样:

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(),但这样做是正确的吗?

2 个回答

1

正确的方法就是能用的方法。如果你发现了更好的办法,随时可以改成那个。

1

可能对提问者来说已经太晚了,但我还是想回复一下,希望对其他人有帮助。

创建事件调度器,并使用 pyglet.clock.schedule_interval 定期调用 poll() 是个不错的方法。

要把事件调度器连接到你的窗口,你需要先创建一个调度器的实例,然后调用它的 push_handlers 方法:

dispatcher.push_handlers(window)

这样你就可以像处理窗口中其他事件一样处理这些事件了。

撰写回答