Событие pyglet on_draw происходит только при движении мыши
У меня странная проблема. Когда приложение pyglet запускается, оно просто рисует 1-2 кадра, а затем останавливается. Событие on_draw просто прекращается. Но каждый раз, когда я перемещаю мышь или нажимаю клавиши, отправляется также событие on_draw. Короче говоря, мне нужно двигать мышь, чтобы приложение Pyglet в основном работало.
Это на самом деле происходит в Windows. В Ubuntu с compiz мне нужно только один раз переместить мышь, после чего приложение начинает работать нормально.
Это мой пример кода:
#!/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()
Вот видео, объясняющее вещи.
2 ответа
Я столкнулся с этим прошлой ночью, пытаясь выяснить ту же проблему. Я понял, что вызывает это.
Я использовал декоратор и поместил свои обновления в метод 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 как обычно.
@window.event()
def on_draw():
window.clear()
batch.draw()
Я знаю, что этот вопрос уже давно был задан, и спрашивающий, возможно, уже сдался, но, надеюсь, он поможет всем, кто столкнулся с этой проблемой.
У меня была похожая проблема с событиями обновления, не вызываемыми (используя pyglet из Cygwin на Windows), и оказалось, что была ошибка:
https://groups.google.com/forum/
Я не уверен, что это та же проблема, что и у вас, но, казалось, стоит упомянуть. В итоге я взломал упомянутый файл (pyglet/app/win32.py) вручную (установив self._polling = True в строке 105 в Win32EventLoop._timer_func), и все мои обновления начали работать очень хорошо.