python pygame decorator

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?