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!

  • Iteration über einzelne Bytes in python3
  • Was ist der bevorzugte Weg, um eine Zeichenfolge in Python zu verketten?
  • Python-Fehler auf Operator Keyword
  • Überprüfen Sie auf die Veränderlichkeit in Python?
  • AttributeError: 'Modul' Objekt hat kein Attribut 'Auswahl'
  • Brauchen Sie einen schnellen Weg zu zählen und summieren Sie eine iterable in einem einzigen Pass
  • Rekursive Erstellung einer Baumhierarchie ohne Verwendung von Klasse / Objekt
  • Python <Keine solche Datei oder Verzeichnis: 'gs'> Fehler auch bei GhostScript auf Macintosh installiert * Problem noch anhaltend! *
  • Maximale Temperatur für jeden Monat in einer CSV-Datei finden?
  • Wie kann man sagen, ob ein String gültigen Python-Code enthält
  • Zip-Liste der Tupel mit flacher Liste
  • Python ist die beste Programmiersprache der Welt.