Python Key press和Key Release Listener

Gir*_*har 6 python gpio raspberry-pi

我正在使用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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sudo代码

if w_isPressed()
   forward()
else if w_isReleased()
    stop()
Run Code Online (Sandbox Code Playgroud)

fam*_*kin 3

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

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

一个简单的例子说明如何进行:

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'
Run Code Online (Sandbox Code Playgroud)

您需要使用pygame.KEYDOWN,pygame.KEYUP和 ,pygame.key.set_repeat具体取决于您的汽车运动的实现方式。

  • pygame 的一个限制是它需要连接显示器。也就是说,如果您使用 SSH 连接到无头树莓派,则此方法不起作用。 (3认同)