Maison > développement back-end > Tutoriel Python > Pourquoi `pygame.event.get()` ne parvient-il pas à renvoyer les événements dans un thread séparé ?

Pourquoi `pygame.event.get()` ne parvient-il pas à renvoyer les événements dans un thread séparé ?

Patricia Arquette
Libérer: 2024-12-01 11:54:13
original
708 Les gens l'ont consulté

Why Does `pygame.event.get()` Fail to Return Events in a Separate Thread?

pygame.event.get() Échec du retour des événements dans un fil de discussion séparé

Cette requête concerne les difficultés rencontrées lors de l'utilisation de pygame.event .get() dans un thread séparé pour gérer les entrées des utilisateurs dans un jeu inspiré de Pac-Man. L'extrait de code responsable de la réception des entrées est le suivant :

def receiving_inputs(self):
    while True:
        events = pg.event.get()
        for event in events:
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_UP:
                    self.move = 'n'
                elif event.key == pg.K_RIGHT:
                    self.move = 'e'
                elif event.key == pg.K_DOWN:
                    self.move = 's'
                elif event.key == pg.K_LEFT:
                    self.move = 'w'
        time.sleep(1/60)

threading.Thread(target=self.receiving_inputs).start()
Copier après la connexion

Lorsque ce code est exécuté, appuyer sur les touches du clavier ne déclenche aucun événement, tandis que déplacer la souris renvoie des événements. Curieusement, le même code fonctionne parfaitement lorsqu'il est exécuté dans la boucle principale du programme plutôt que dans un thread séparé.

La question découle du désir de minimiser les cas de pressions sur des touches non enregistrées dans la boucle principale en employant un thread séparé. .

Résolution :

Le comportement inattendu vient du fait qu'il faut gérer les événements dans le fil principal. Comme indiqué dans la documentation thepygame.event :

[...] Le sous-système d'événements doit être appelé à partir du thread principal.

Bien qu'il soit possible de publier des événements à partir d'un fil de discussion distinct, l'événement la file d'attente ne peut être traitée que par le thread principal. Ainsi,

  1. Assurez-vous que les événements sont obtenus dans le fil principal :

    def receiving_inputs(self):
        while True:
            events = pg.event.get()
            for event in events:
                ...
    Copier après la connexion
  2. Créez un fil pour modifier l'état du jeu en fonction du événements :

    def move(self, move):
        ...
    
    thread = threading.Thread(target=self.move, args=(move,))
    thread.start()
    Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal