python - pygame.init() no parece ser llamado en un decorador
decorator (1)
Si __call__
un vistazo a tu función __call__
, verás que cuando rompes, vuelves al ciclo while. Regresar de la función resolverá el problema.
def __call__(self):
while True:
pygame.time.wait(50)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
return
self.func()
He intentado poner el ciclo del evento principal en un decorador con la esperanza de que mi programa se vea mejor. Tengo dos archivos, main.py
y event_loop_decorator.py
.
En event_loop_decorator.py
:
import pygame
class EventLoop(object):
def __init__(self, func):
self.func = func
pygame.init()
print("pygame should have been initialised.")
def __call__(self):
while True:
pygame.time.wait(50)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
break
self.func()
En main.py
:
import pygame
import event_loop_decorator
@event_loop_decorator.EventLoop
def while_in_event_loop():
pass
if __name__ == "__main__":
surface = pygame.display.set_mode((200, 100))
surface.fill((255, 0, 0))
pygame.display.flip()
while_in_event_loop()
Como puede ver, el sencillo programa está destinado a mostrar solo una pequeña ventana de 200 * 100 pintada de rojo. Funciona bien, y el botón de ventana de salida parece funcionar bien. Pero después de salir del programa, obtengo la siguiente salida y error.
pygame should have been initialised.
Traceback (most recent call last):
File "C:/Users/ray/Dropbox/Programming/Python/pygame_test/code/main.py", line 50, in <module>
while_in_event_loop()
File "C:/Users/ray/Dropbox/Programming/Python/pygame_test/code/event_loop_decorator.py", line 13, in __call__
for event in pygame.event.get():
pygame.error: video system not initialized
Process finished with exit code 1
Vemos que se llamó al comando de impresión en el constructor del decorador, es la primera línea en el resultado. Pero más tarde en la salida vemos que aparentemente "el sistema de video no se inicializó". Cuando lo hago sin el decorador, todo funcionó perfectamente. Por cierto, esta es la primera vez que uso decoradores.
¿Alguna ayuda? ¿Estoy haciendo algo mal con los decoradores? ¿Debería pygame.init()
nunca usarse con decoradores?