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

标签 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解释事情。

最佳答案

我昨晚在试图找出同样的问题时遇到了这个问题。我弄清楚是什么原因造成的。

我使用了一个装饰器并将我的更新放在 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()

我知道这个问题已经有一段时间了,提问者可能已经放弃了,但希望它能帮助遇到这个问题的其他人。

关于pyglet on_draw 事件仅在鼠标移动时发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21060970/

相关文章:

python - 用Python检查圆扇形中是否存在一个点

python - Pyglet 仅适用于已安装的字体?

python - 我使用的列表有误吗?这个简单的 python/pyglet 代码中的内存泄漏

python - 如何使用 opengl/pyglet 在 python 中绘制/使用像素并更改该像素的大小?

python - Pyglet:火球射击游戏,每当我按下指定的键时,火球就会不断加速,而不是保持恒定速度

python "draw() must be called with Label instance as first argument (got _WindowMetaclass instance instead)"

OpenGL - 创建一个圆,改变半径?

python - 3d 立方体未正确显示 pyglet 写入

python - 如何组织3D游戏的结构?

opengl - 渲染到 FBO + glReadPixels 全黑