我有一个奇怪的问题。当pyglet应用程序启动时,它只绘制1-2帧然后冻结。 on_draw事件刚刚停止发生。但每次我移动鼠标或按键时,on_draw事件也会发送。总之,我必须移动鼠标才能使我的pyglet应用程序基本起作用。
这实际上发生在Windows中。在使用compiz的Ubuntu中,我只需移动一次鼠标,然后应用程序开始正常工作。
这是我的代码示例:
#!/usr/bin/env python
import pyglet
win = pyglet.window.Window(width=800, height=600)
label = pyglet.text.Label('Abc', x=5, y=5)
@win.event
def on_draw():
win.clear()
label.x += 1
label.draw()
pyglet.app.run()
这是a video解释事情。
答案 0 :(得分:1)
昨晚我试图找出同样的问题时遇到了这个问题。我想出了导致这种情况的原因。
我曾经使用过装饰器并将我的更新放在on_draw方法中,它会运行一段时间,然后它会冻结,只有当我移动鼠标或按键盘时再次开始工作。我尝试了各种各样的技巧来解决它,我终于认为可能事情只是运行得太快,并且将它们放在批处理中并让pyglet决定何时更新它们会更好。它奏效了。
我还安排了一些东西,这样它们的运行速度大约是刷新速度的两倍,但速度不会太快,它会让任何事情变得迟钝。这对于流畅的动画来说已经足够了。
needles_list = [gauges.speedometer.Needle(speedometer_data, needle, batch=batch, group=needles),
gauges.tachometer.Needle(tachometer_data, needle, batch=batch, group=needles)]
def update(dt):
for needle in needles_list:
needle.update(dt)
pyglet.clock.schedule_interval(update, 1/120.0)
gauges.speedometer.Needle和gauges.tachometer.Needle是pyglet.sprite.Sprite的子类,我为每个人编写了一个更新方法。然后我像往常一样在on_draw中调用他们的draw方法。
@window.event()
def on_draw():
window.clear()
batch.draw()
我知道这个问题已经有一段时间了,提问者可能已经放弃了,但希望这会帮助其他任何有这个问题的人。
答案 1 :(得分:0)
我有一个类似的更新事件未被调用的问题(在Windows上使用Cygwin的pyglet),结果发现有一个错误:
https://groups.google.com/forum/#!msg/pyglet-users/Qp1HzPHcUEQ/A9AFddycLSAJ
我不确定你遇到的问题是什么,但似乎值得一提。我最终手工攻击了提到的文件(pyglet / app / win32.py)(在第55行,在Win32EventLoop._timer_func中设置self._polling = True)并且我的所有更新都开始流畅了。