Каждый графический интерфейс (или игры) запускает специальный цикл под названием «MainLoop» или «даже петля», которая делает всю работу. Pyglet запускает этот цикл с run()
.
Pyglet имеет специальную очередь для информации называемого «событие»
При нажатии кнопки, то система добавляет в очередь информации «event_keydown» с нажатой клавишей; когда вы нажимаете кнопку мыши, система добавляет в очередь информацию «event_mousebuttondown» с нажатой кнопкой и положением мыши; и т. д.
Другие функции в Pyglet также могут добавлять информацию в очередь, поэтому mainloop может получить эту информацию из очереди, но позже. то есть. когда вы нажимаете кнопку, тогда кнопка может добавить в очередь «even_draw», потому что ее нужно перерисовать с новым цветом, а mainloop сделает это, но позже.
@window.event
добавляет имя функции в специальный список/словарь, присвоенный названию события, т.е.
special_dict["event_draw"] = on_draw
"mainloop" проверяет всю очередь на события. Когда он получает «event_draw», тогда он проверяет «special_dict», чтобы получить имя функции, которое он должен выполнить, и он получает «on_draw» и выполняет «on_draw()»
Когда вы нажимаете мышью, система затем помещает в очередь «event_mousebuttondown ». Когда mainloop получает этот «event_mousebuttondown» из очереди, он отправляет его всем виджетам, и каждый виджет проверяет, было ли оно нажато. Если был выбран какой-то виджет и нужно изменить цвет/фигуру/и т. Д. то он может поставить «event_draw» в очередь. Позже «mainloop | может получить« event_draw »из очереди и выполнить« on_draw », чтобы перерисовать окно.
Поскольку« mainloop »все время проверяет очередь и делает это быстро (и все функции, назначенные событиям короткими), тогда она выглядит так как все выполняется одновременно, и все виджеты работают одновременно - например, они используют потоки (но они не используют потоки). Когда вы помещаете sleep()
или while True
в любую функцию, тогда останавливается «mainloop» и все замораживается
BTW: в PyGame вам нужно создать собственный «mainloop», чтобы вы могли узнать об этом. – furas
в [Dispatching events вручную] (http://pyglet.readthedocs.io/en/pyglet-1.2-maintenance/ programming_guide/eventloop.html # dispatching-events-вручную) у вас есть пример mainloop для Pyglet - 'while True'. – furas
Вы также можете узнать, как создать собственный «mainloop» в Pyglet. Основной пример создания можно найти здесь (и во многих других местах): http://stackoverflow.com/a/41466615/ 929999 – Torxed