【问题标题】:Python Key press and Key Release ListenerPython 按键和按键释放监听器
【发布时间】:2014-06-22 15:29:37
【问题描述】:

我正在使用 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'时,forward() 方法被调用并且汽车向前移动但不会停止,直到我退出程序或从其他方法调用GPIO.output(11, False)

是否有任何按键监听器可以检测到任何特定按键的按键释放?

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

须藤代码:

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

【问题讨论】:

  • 如果没有实际的键盘访问权限,您将无法执行此操作。您的终端仅发送按键,因此您无法判断按键何时被释放。
  • 你也许可以使用 PyGame 来做到这一点。

标签: python raspberry-pi gpio


【解决方案1】:

我之前已经看到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,具体取决于您的汽车运动是如何实现的。

【讨论】:

  • pygame 的一个限制是它需要连接显示器。也就是说,如果您使用 SSH 连接到无头树莓派,则此方法不起作用。
【解决方案2】:

遇到了类似的问题(我不是 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()

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 2011-06-14
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多