Pyglet主循环在哪里?

时间:2015-07-04 07:14:23

标签: python pyglet

考虑以下示例:

import pyglet

def foo():
    print("I'm in a loop...")

def main():

    w = pyglet.window.Window()

    @w.event
    def on_draw():
        foo()

    pyglet.app.run()

    return 0

if __name__ == '__main__':
    main()

真的期待on_draw()会在内部主循环中绘制内容,而是......

enter image description here

愚弄我,只执行一次代码。 哪里 是Pyglet的实际主循环?这样我就可以真正更新那里的东西,而不只是画一次(这是没用的)。

2 个答案:

答案 0 :(得分:2)

我猜您正在寻找像GLUT's main loop这样的东西。我之前从未使用pyglet,但在this tutorial中,它基本上使用:

pyglet.clock.schedule_interval(update, 1/120.0)

所以,你可以这样做:

import pyglet

def foo(value):
    print("I'm in a loop...")

def main():
    w = pyglet.window.Window()
    @w.event
    def on_draw():
        foo(None)
    pyglet.clock.schedule_interval(foo, 1.0)
    pyglet.app.run()

main()

同样,我不是该领域的专家。可能有更好的方法。

答案 1 :(得分:0)

EventLoop类包含run方法(pyglet.app.run),基本上是'主循环'。它管理预定事件,让进程休眠,并管理来自操作系统的事件。通过检查源,您可以找到它的工作原理。你可以在pyglet / app / base.py中找到它。

为了澄清你的代码片段没有按预期工作的原因,pyglet只有当pyglet执行了一个预定的事件或者被操作系统明确标记为无效时才会触发事件。逻辑是,如果没有事件被触发会改变屏幕,为什么要绘制屏幕?如果您正在尝试安排一个被称为app循环的每次迭代的事件,那么请使用pyglet.clock.schedule。

https://pyglet.readthedocs.org/en/latest/programming_guide/features1.1.html#application-event-loop

https://pyglet.readthedocs.org/en/latest/api/pyglet/pyglet.clock.html#scheduling