2017-01-08 13 views
0

Я работаю над изучением пиглета, и я был смущен тем, что сделал @window.event. Я обратился к документации Python и сказал, что он передал функцию ниже через функцию декоратора, но я не знаю, что это делает для Pyglet. Я ничего не мог найти в документах для пиглета. И я также смущен, как и когда вызывается on_draw(), если это имеет какое-то отношение к первой проблеме. Заранее спасибо.Как работает pyglet.window.Window.event?

Код для pyglet.window.Window.event здесь: pyglet source

ответ

0

Каждый графический интерфейс (или игры) запускает специальный цикл под названием «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» и все замораживается

+0

BTW: в PyGame вам нужно создать собственный «mainloop», чтобы вы могли узнать об этом. – furas

+0

в [Dispatching events вручную] (http://pyglet.readthedocs.io/en/pyglet-1.2-maintenance/ programming_guide/eventloop.html # dispatching-events-вручную) у вас есть пример mainloop для Pyglet - 'while True'. – furas

+0

Вы также можете узнать, как создать собственный «mainloop» в Pyglet. Основной пример создания можно найти здесь (и во многих других местах): http://stackoverflow.com/a/41466615/ 929999 – Torxed

 Смежные вопросы

  • Нет связанных вопросов^_^