简体   繁体   English

Python按键和按键释放监听器

[英]Python Key press and Key Release Listener

I am controlling a remote toy car using python code .As of now the code is as below 我正在使用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

When i press 'w' forward() method is called and the car moves forward but wont stop until i quit the program or call GPIO.output(11,Flase) from some other method. 当我按'w'时,会调用forward()方法,汽车会​​向前行驶,但不会停止,直到我退出程序或从其他方法调用GPIO.output(11,Flase)。

Is there any key Listener which detects key release of any particular key . 是否有任何密钥侦听器可以检测任何特定密钥的密钥释放。

For example , if 'w' pressed called this method and if released call some other method 例如,如果按下“ w”调用此方法,如果释放则调用其他方法

Sudo code 须藤代码

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

I've seen Pygame game development library being successfully used in similar scenarios before, handling realtime systems and machinery in production, not just toy examples. 我已经看到Pygame游戏开发库以前曾在类似场景中成功使用过,不仅可以处理玩具示例,还可以处理生产中的实时系统和机器。 I think it's a suitable candidate here too. 我认为这也是一个合适的候选人。 Check out pygame.key module for what is possible to do with the keyboard input. 查看pygame.key模块以了解键盘输入可能做什么。

In short, if you are not familiar with game development, you basically continuously poll for events such as input state changes inside an 'infinite' game loop and react accordingly. 简而言之,如果您不熟悉游戏开发,则基本上可以连续轮询事件,例如“无限”游戏循环内的输入状态更改,并做出相应的反应。 Usually update the parameters of the system using deltas per time elapsed. 通常,每个时间使用增量来更新系统参数。 There's plenty of tutorials on that and Pygame available around and Pygame docs are pretty solid. 有很多关于它的教程,Pygame可用,并且Pygame文档非常扎实。

A simple example of how to go about it: 一个简单的例子:

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'

You'll need to play with pygame.KEYDOWN , pygame.KEYUP and pygame.key.set_repeat depending on how your car movement is implemented. 您需要根据如何实现汽车运动来玩pygame.KEYDOWNpygame.KEYUPpygame.key.set_repeat

Faced a similar problem (I am no Python expert) but this worked for me 遇到类似的问题(我不是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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM