Python Key press和Key Release Listener

时间:2014-06-22 15:29:38

标签: python raspberry-pi gpio

我正在使用python代码控制远程玩具车。截至目前,代码如下

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

当我按'w'向前()方法被调用并且汽车向前移动但不会停止直到我 退出程序或从其他方法调用GPIO.output(11,Flase)。

是否有任何键侦听器可以检测任何特定键的键释放。

例如,如果'w'按下调用此方法,如果释放则调用其他方法

Sudo代码

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

2 个答案:

答案 0 :(得分:2)

我之前看到Pygame游戏开发库在类似场景中被成功使用,处理生产中的实时系统和机器,而不仅仅是玩具示例。我认为这也是一个合适的候选人。查看pygame.key模块,了解键盘输入的可能性。

简而言之,如果您不熟悉游戏开发,您基本上会持续轮询“无限”游戏循环内的输入状态变化等事件,并做出相应的反应。通常每经过一次使用增量更新系统的参数。有很多关于它的教程和可用的Pygame,Pygame docs非常可靠。

如何解决这个问题的一个简单例子:

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'

您需要使用pygame.KEYDOWNpygame.KEYUPpygame.key.set_repeat,具体取决于您的汽车行动方式。

答案 1 :(得分:0)

遇到了类似的问题(我不是Python专家),但这对我有用

import pynput
from pynput import keyboard 

def on_press(key):
    try:
        print('Key {0} pressed'.format(key.char))
        #Add your code to drive motor
    except AttributeError:
        print('Key {0} pressed'.format(key))
        #Add Code
def on_release(key):
    print('{0} released'.format(key))
    #Add your code to stop motor
    if key == keyboard.Key.esc:
        # Stop listener
        # Stop the Robot Code
        return False

# Collect events until released
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()