Не вызывает ли проблем использование декоратора в pyglet?

#python #pyglet

#python #pyglet

Вопрос:

Я создавал простой код в pyglet для рисования прямоугольника на экране, но когда я использовал правильный формат кода, ничего не происходит, но и ошибок не возникает

 window=pyglet.window.Window()
rect=pyglet.shapes.Shapes(0,0,50,50,color=(255,255,255))
@window.event
def draw_():
    rect.draw()
pyglet.app.run()
 

этот код просто приводит к черному экрану. Прямоугольник не печатается, но если я использую этот код вместо

 window=pyglet.window.Window()
rect=pyglet.shapes.Shapes(0,0,50,50,color=(255,255,255))
    
def draw_():
    rect.draw()
pyglet.app.run()
 

прямоугольник напечатан.
Поскольку 2-й код не является стандартным методом рисования фигуры в pyglet, я хотел бы знать, есть ли что-то неправильное в этом (проблемы с производительностью, сбои и т. Д.)
Если 2-й код неверен, что мне делать вместо этого?

Ответ №1:

Событие перерисовки on_draw() , а не draw_ :

 @window.event
def on_draw():
    rect.draw()
 

Если вы не используете декоратор, обработчик событий по умолчанию полностью заменяется:

 def on_draw():
   rect.draw()
 

Когда вы используете оформление, добавляется дополнительный обработчик событий. Поэтому сохраняется обработчик по умолчанию:

 @window.event
def on_draw():
   rect.draw()
 

См. PyGlet — Настройка обработчиков событий

[…] Самый простой способ — напрямую прикрепить обработчик события к соответствующему атрибуту объекта. Это полностью заменит обработчик событий по умолчанию. […]

[…] Если вы не хотите заменять обработчик событий по умолчанию, а вместо этого хотите добавить дополнительный, pyglet предоставляет ярлык с использованием декоратора событий. Будет запущен ваш пользовательский обработчик событий, за которым последует обработчик событий по умолчанию. […]