pyglet on_draw事件仅在鼠标移动时发生

时间:2014-01-11 10:05:22

标签: pyglet

我有一个奇怪的问题。当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解释事情。

2 个答案:

答案 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)并且我的所有更新都开始流畅了。