Событие 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), и все мои обновления начали работать очень хорошо.

Другие вопросы по тегам