Где основной цикл Pyglet?

Рассмотрим следующий пример:

import pyglet

def foo():
    print("I'm in a loop...")

def main():

    w = pyglet.window.Window()

    @w.event
    def on_draw():
        foo()

    pyglet.app.run()

    return 0

if __name__ == '__main__':
    main()

Я на самом деле ожидал, что on_draw() будет рисовать объекты во внутреннем основном цикле, но вместо этого...

введите здесь описание изображения

Это обманывает меня, выполняя код только один раз. Где находится главный цикл Pyglet? Так что я могу действительно обновлять вещи, а не просто рисовать один раз (что бесполезно).


person Ericson Willians    schedule 04.07.2015    source источник


Ответы (2)


Я думаю, вы ищете что-то вроде основного цикла GLUT. На самом деле я никогда раньше не использовал pyglet, но в этом руководстве он в основном использует:

pyglet.clock.schedule_interval(update, 1/120.0)

Итак, вы можете сделать что-то вроде:

import pyglet

def foo(value):
    print("I'm in a loop...")

def main():
    w = pyglet.window.Window()
    @w.event
    def on_draw():
        foo(None)
    pyglet.clock.schedule_interval(foo, 1.0)
    pyglet.app.run()

main()

Повторюсь, я не специалист в этой области. Там может быть лучший способ сделать это.

person Sait    schedule 04.07.2015
comment
Я бы никогда не подумал об этом, ха-ха (установка времени/интервала для каждой отдельной функции). Это несколько странно (или, возможно, я слишком привык к SDL/Allegro/Pygame). - person Ericson Willians; 04.07.2015
comment
@RederickDeathwill Я тоже подумал, что это странно. Мы должны прочитать всю документацию, чтобы убедиться, что это правильный способ ее использования. Или, может быть, какой-то другой эксперт может прокомментировать этот трек. - person Sait; 04.07.2015
comment
Вот точная часть в документах. Очень интересно... - person Ericson Willians; 04.07.2015

Класс EventLoop содержит метод запуска (pyglet.app.run) и, по сути, является «основным циклом». Он управляет запланированными событиями, переводя процесс в спящий режим, и управляет событиями из ОС. Изучив источник, вы можете понять, как это работает. Вы можете найти его в pyglet/app/base.py.

Чтобы выяснить, почему ваш фрагмент кода не работает должным образом, pyglet будет выполнять события on_draw только тогда, когда pyglet выполнил запланированное событие или был явно помечен операционной системой как недопустимый; логика такова, зачем рисовать экран, если не произошло никаких событий, которые изменили бы экран? Если вы пытаетесь запланировать событие, вызываемое каждой итерацией цикла приложения, используйте pyglet.clock.schedule.

https://pyglet.readthedocs.io/en/latest/programming_guide/eventloop.html

https://pyglet.readthedocs.io/en/latest/modules/clock.html#scheduling

person Leif Theden    schedule 28.10.2015
comment
Вышеупомянутые ссылки не работают на сегодняшний день. - person Tim Ludwinski; 28.08.2020
comment
Приведенные выше ссылки следует заменить на: pyglet.readthedocs.io/en/latest/ Programming_guide/ и pyglet.readthedocs.io/en/latest /modules/clock.html#scheduling. - person Tim Ludwinski; 28.08.2020