Heim > Backend-Entwicklung > Python-Tutorial > Warum kann „pygame.event.get()' keine Ereignisse in einem separaten Thread zurückgeben?

Warum kann „pygame.event.get()' keine Ereignisse in einem separaten Thread zurückgeben?

Patricia Arquette
Freigeben: 2024-12-01 11:54:13
Original
707 Leute haben es durchsucht

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

pygame.event.get() Fehler beim Zurückgeben von Ereignissen innerhalb eines separaten Threads

Diese Abfrage bezieht sich auf Schwierigkeiten, die bei der Verwendung von pygame.event auftreten .get() innerhalb eines separaten Threads zum Verwalten von Benutzereingaben in einem von Pac-Man inspirierten Spiel. Der Codeausschnitt, der für den Empfang von Eingaben verantwortlich ist, lautet wie folgt:

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()
Nach dem Login kopieren

Wenn dieser Code ausgeführt wird, löst das Drücken der Tastaturtasten keine Ereignisse aus, während das Bewegen der Maus Ereignisse zurückgibt. Interessanterweise funktioniert derselbe Code einwandfrei, wenn er in der Hauptschleife des Programms und nicht in einem separaten Thread ausgeführt wird.

Die Frage ergibt sich aus dem Wunsch, die Häufigkeit von Tastendrücken, die in der Hauptschleife nicht registriert werden, durch die Verwendung eines separaten Threads zu minimieren .

Lösung:

Das unerwartete Verhalten ergibt sich aus der Tatsache, dass Ereignisse vorliegen müssen wird im Hauptthread verwaltet. Wie in der thepygame.event-Dokumentation angegeben:

[...] Das Ereignissubsystem sollte vom Hauptthread aus aufgerufen werden.

Während es möglich ist, Ereignisse aus einem separaten Thread zu veröffentlichen, ist das Ereignis Die Warteschlange kann nur vom Hauptthread verarbeitet werden. Daher

  1. Stellen Sie sicher, dass Ereignisse im Hauptthread abgerufen werden:

    def receiving_inputs(self):
        while True:
            events = pg.event.get()
            for event in events:
                ...
    Nach dem Login kopieren
  2. Erstellen Sie einen Thread, um den Spielstatus basierend auf dem zu ändern Veranstaltungen:

    def move(self, move):
        ...
    
    thread = threading.Thread(target=self.move, args=(move,))
    thread.start()
    Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum kann „pygame.event.get()' keine Ereignisse in einem separaten Thread zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage