2017-05-06 8 views
0

Ich habe diesen Code:Steuerung RPI Motorantrieb mit Tkinter Liegt

import RPi.GPIO as GPIO 
import sys 
from time import sleep 
import Tkinter as tk 

GPIO.setmode(GPIO.BOARD) 
GPIO.setup(13, GPIO.OUT) 
GPIO.setup(15, GPIO.OUT) 

def forward(event): 
    GPIO.output(13, GPIO.HIGH) 
    sleep(0.2) 
    GPIO.output(13, GPIO.LOW) 

def back(event): 
    GPIO.output(15, GPIO.HIGH) 
    sleep(0.2) 
    GPIO.output(15, GPIO.LOW) 

def right(event): 
    GPIO.cleanup() 

def left(event): 
    print("a") 

def key_input(event): 

    print 'Key:', event.char  
    key_press = event.char  
    sleep_time = 0.030 

    if key_press.lower() == 'w':  
     forward(sleep_time) 

    elif key_press.lower() == 's':  
     back(sleep_time) 

    elif key_press.lower() == 'a':  
     left(sleep_time) 

    elif key_press.lower() == 'd':  
     right(sleep_time) 

root = tk.Tk()  
root.bind('<KeyPress>', key_input)  
root.mainloop() 

Wenn ich es auf meinem raspbery pi b3 laufen, ich habe eine Menge Liegt .. Wie Sie den Code zu verbessern, ohne Verzögerung zu laufen, oder wie man es ändert, um den Motor mit meiner Tastatur zu steuern?

Ich will nur nach vorne, mein Auto bewegen, rückwärts, rechts und links ... Ich kann es googeln, und ich sehe die am häufigsten verwendete Methode mit tkinter ist ...

Die unfertige Code ist, und ist nur für ein Motor. Ich versuche, Presse/Release-Ereignis zu verwenden, aber nicht arbeiten .. Bitte jemand mir helfen !!

+0

Warum übergeben Sie eine Zeit an Funktionen, die ein Ereignisobjekt akzeptieren? –

Antwort

0

Sie sollten nicht mit time.sleep in einem GUI-Programm arbeiten, von wo Ihre Verzögerung kommt, Sie passieren auch eine Zeit, in der Sie ein Ereignis erwarten, und ignorieren es dann trotzdem?

import RPi.GPIO as GPIO 
import sys 
import Tkinter as tk 

GPIO.setmode(GPIO.BOARD) 
GPIO.setup(13, GPIO.OUT) 
GPIO.setup(15, GPIO.OUT) 

class App(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.bind('<KeyPress>', self.KeyDown) 
     self.bind('<KeyRelease>', self.KeyUp) 

    def KeyDown(self, event): 
     if event.char: 
      k = event.char.lower() 
      if k == 'w': 
       GPIO.output(13, GPIO.HIGH) 
      elif k == 'a': 
       GPIO.output(15, GPIO.HIGH) 
      elif k == 's': 
       pass 
      elif k == 'd': 
       pass 

    def KeyUp(self, event): 
     if event.char: 
      k = event.char.lower() 
      if k == 'w': 
       GPIO.output(13, GPIO.LOW) 
      elif k == 'a': 
       GPIO.output(15, GPIO.LOW) 
      elif k == 's': 
       GPIO.cleanup() 
      elif k == 'd': 
       print("a") 

if __name__ == '__main__': 
    app = App() 
    app.mainloop() 

Wenn Sie binden die Presse und Freigabe Ereignisse separat können Sie den Motor einschalten, wenn Sie die Taste drücken und aus, wenn sie losgelassen wird, das sollte die meisten Ihrer Verzögerung beseitigen.