python - modules - vitesse pygame



pygame.init() ne semble pas être appelé dans un décorateur (1)

J'ai essayé de mettre la boucle principale d'événement dans un décorateur dans l'espoir que mon programme semblerait plus propre. J'ai deux fichiers, main.py et event_loop_decorator.py .

Dans 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()

Dans 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()

Comme vous pouvez le voir, le programme simple est destiné à montrer juste une petite fenêtre de 200 * 100 peinte en rouge. Cela fonctionne bien, et le bouton de la fenêtre de sortie semble fonctionner correctement. Mais après la sortie du programme, j'obtiens la sortie et l'erreur suivantes.

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

Nous voyons que la commande print dans le constructeur du décorateur a été appelée, c'est la première ligne de la sortie. Mais plus tard dans la sortie, nous voyons que, apparemment, "système vidéo non initialisé". Quand je le fais sans le décorateur, tout a parfaitement fonctionné. En passant, c'est la première fois que j'ai utilisé des décorateurs.

De l'aide? Est-ce que je fais quelque chose de mal avec les décorateurs? Est-ce que pygame.init() ne devrait jamais être utilisé avec des décorateurs?


Si vous jetez un coup d'oeil à votre fonction __call__ , vous verrez que lorsque vous cassez, vous revenez à la boucle while à nouveau. Le retour de la fonction résoudra le problème.

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()




decorator