Wie benutzt man Threads, um die Eingabe von der Tastatur in Python 3 zu bekommen?

Ich mache ein Schlangenspiel, das verlangt, dass der Spieler die WASD Tasten drückt, ohne den Spielprozess zu stoppen, um vom Spieler zu bekommen. Also kann ich keinen input() für diese Situation verwenden, da dann das Spiel hört zu ticken, um Eingang zu bekommen.

Ich habe eine getch() -Funktion gefunden, die sofort Eingabe gibt, ohne Enter zu drücken, aber diese Funktion stoppt auch das Spiel ticking, um Eingang wie input() zu bekommen. Ich habe mich entschlossen, das Threading-Modul zu verwenden, um über getch() in verschiedenen Threads eingegeben zu werden. Das Problem ist, dass getch () nicht funktioniert, während in verschiedenen Thread und ich bin mir nicht sicher, warum.

 import threading, time from msvcrt import getch key = "lol" #it never changes because getch() in thread1 is useless def thread1(): while True: key = getch() #this simply is almost ignored by interpreter, the only thing it #gives is that delays print() unless you press any key print("this is thread1()") threading.Thread(target = thread1).start() while True: time.sleep(1) print(key) 

Also warum getch() ist nutzlos, wenn es in getch() ist?

2 Solutions collect form web for “Wie benutzt man Threads, um die Eingabe von der Tastatur in Python 3 zu bekommen?”

Das Problem war, dass Sie einen lokalen Variablenschlüssel innerhalb von thread1 erstellen, anstatt das bestehende zu überschreiben. Die schnelle und einfache Lösung wäre, den key zu definieren, um global in thread1 .

Schließlich sollten Sie Sperren verwenden. Ich weiß nicht, ob es notwendig ist oder nicht, aber ich würde mir vorstellen, dass seltsame Dinge passieren könnten, wenn Sie versuchen, einen Wert zu schreiben, um den Thread zu betreten, während er gleichzeitig ausdruckt.

Der Arbeitscode:

 import threading, time from msvcrt import getch key = "lol" def thread1(): global key lock = threading.Lock() while True: with lock: key = getch() threading.Thread(target = thread1).start() while True: time.sleep(1) print(key) 

Ich habe versucht, getch zu benutzen, aber es hat nicht für mich gearbeitet … (win7 hier).

Du kannst versuchen, tkinter module // zu verwenden, aber ich kann es immer noch nicht mit Threads laufen lassen

 # Respond to a key without the need to press enter import tkinter as tk #on python 2.x use "import Tkinter as tk" def keypress(event): if event.keysym == 'Escape': root.destroy() x = event.char if x == "w": print ("W pressed") elif x == "a": print ("A pressed") elif x == "s": print ("S pressed") elif x == "d": print ("D pressed") else: print (x) root = tk.Tk() print ("Press a key (Escape key to exit):") root.bind_all('<Key>', keypress) # don't show the tk window root.withdraw() root.mainloop() 

Wie Michael0x2a sagt, können Sie versuchen, die Bibliothek für das Spiel machen – Pygame oder Pyglet gemacht.

@EDIT @ Michael0x2a: Bist du sicher, dass dein Code funktioniert? Was immer ich drücke, druckt immer die gleiche Taste.

@ EDIT2: Vielen Dank!

  • Networkx - Farbe / Breite entsprechend den Randattributen ändern - inkonsistentes Ergebnis
  • Führen Sie die Box-Abdeckung auf einem Diagramm mit Zython
  • Sortierung von Array-Daten nach gemeinsamen Datum
  • Sortierung der Tupel von Tupeln
  • Python: Abrufen von Elementen aus einem Satz
  • SyntaxError Ungültiges Token
  • Diesen Code in eine Python-Funktion umwandeln
  • So stellen Sie fest, welche Version von python sublime text verwendet wird
  • Python 3 Typ Hinweise für Leistungsoptimierungen
  • Finden Sie die aktuelle Position des Cursors in der Python-Schildkröte
  • Python enum - immer Wert von enum auf String Umwandlung
  • Python ist die beste Programmiersprache der Welt.