2014-06-22 11 views
6

Ich bin eine Remote-Spielzeugauto mit Python Code .Als von jetzt dem Code zu steuern ist als untenPython Key drücken und Schlüsselentriegelung Listener

def getkey(): 
     fd = sys.stdin.fileno() 
     old = termios.tcgetattr(fd) 
     new = termios.tcgetattr(fd) 
     new[3] = new[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO 
     new[6][TERMIOS.VMIN] = 1 
     new[6][TERMIOS.VTIME] = 0 
     termios.tcsetattr(fd, TERMIOS.TCSANOW, new) 
     c = None 
     try: 
       c = os.read(fd, 1) 
     finally: 
       termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, old) 
     return c 

def car(): 
    while True: 
     key = getkey() 
     if key == 's': #Down arrow 
      print "Down" 
      Backward() 
     elif key == 'w': #Up arrow 
      print "Up" 
      forward() 
     elif key == 'a': 
      print "left" 
      Left() 
     elif key == 'd': 
      print "Right" 
      Right() 
     elif key == 'q': #Quit 
      print "That's It" 
      break 
def forward(): 
    GPIO.output(11,True) #Move forward 

Wenn i ‚w‘ nach vorne drücken() -Methode aufgerufen wird und die Auto bewegt sich vorwärts, aber wird nicht aufhören, bis ich das Programm beenden oder GPIO.output (11, Flase) von einer anderen Methode aufrufen.

Gibt es einen Schlüssel-Listener, der die Schlüsselfreigabe eines bestimmten Schlüssels erkennt?

Wenn beispielsweise ‚w‘ gedrückt diese Methode und wenn freigegeben Aufruf aufgerufen eine andere Methode

Sudo Code

if w_isPressed() 
    forward() 
else if w_isReleased() 
    stop() 
+1

Sie können dies ohne tatsächlichen Tastaturzugriff nicht tun. Ihr Terminal sendet nur Tastendrücke, sodass Sie nicht erkennen können, wann ein Schlüssel freigegeben wurde. – Blender

+1

Sie können es möglicherweise mit PyGame tun. – kindall

Antwort

1

Ich habe Pygame Spiele-Entwicklung Bibliothek gesehen erfolgreich in ähnlichen Szenarien eingesetzt werden, bevor Umgang mit Echtzeit-Systemen und Maschinen in der Produktion, nicht nur Spielzeug-Beispiele. Ich denke, dass es auch hier ein geeigneter Kandidat ist. Überprüfen Sie pygame.key Modul für was mit der Tastatureingabe möglich ist.

Kurz gesagt, wenn Sie mit der Entwicklung von Spielen nicht vertraut sind, suchen Sie grundsätzlich ständig nach Ereignissen wie Änderungen des Eingabestatus in einer "unendlichen" Spielschleife und reagieren entsprechend. Normalerweise aktualisieren Sie die Parameter des Systems mit Deltas pro verstrichener Zeit. Es gibt viele Tutorials dazu und Pygame verfügbar und Pygame docs sind ziemlich solide.

Ein einfaches Beispiel dafür, wie man das macht:

import pygame 

pygame.init() 

# to spam the pygame.KEYDOWN event every 100ms while key being pressed 
pygame.key.set_repeat(100, 100) 

while 1: 
    for event in pygame.event.get(): 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_w: 
       print 'go forward' 
      if event.key == pygame.K_s: 
       print 'go backward' 
     if event.type == pygame.KEYUP: 
      print 'stop' 

Sie müssen mit pygame.KEYDOWN, pygame.KEYUP und pygame.key.set_repeat je nachdem, wie Sie Ihr Auto Bewegung umgesetzt wird, spielen.

+0

Eine Einschränkung von pygame besteht darin, dass ein Display verbunden werden muss. Das heißt, dieser Ansatz funktioniert nicht, wenn Sie eine Verbindung zu einem kopflosen Raspberry Pi mit SSH herstellen. – malte