用Pynput监听特定的按键 [英] Listening for specific keys with pynput

查看:454
本文介绍了用Pynput监听特定的按键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望我的代码侦听用户输入,如果按下键c则执行某些操作,如果按下键v则执行其他操作.

I'd like my code to listen for user input, and do something if key c is pressed, and something else if key v is pressed.

我已经设法使用global来做到这一点,但是感觉就像是一个丑陋的骇客:

I've managed to do it using global, but it feels like an ugly hack :

from pynput import keyboard

def on_press(key):
    try:
        global user_input 
        if key.char == "c":
            user_input = "c"
        elif key.char == "v":
            user_input == "v"
    except AttributeError:
        pass

def on_release(key):
    if key == keyboard.Key.esc:
        # Stop listener
        return False

def wait_for_user_input():
    global user_input
    listener = keyboard.Listener(on_press=on_press, on_release=on_release)
    listener.start()
    user_input = 0
    while user_input == 0:
        time.sleep(0.5)
        if user_input == "c":
            # do something
            listener.stop()
            break
        elif user_input == "v":
            # do something else
            listener.stop()
            break
    # other stuff

wait_for_user_input()

有更好的方法吗? (也许是通过让侦听器停止并在on_press()中返回值cv来实现的?如果是这样,我找不到解决方法.)

Is there a better way to do it ? (Maybe by having the listener stop & return the values c or v in on_press() ? If so, I couldn't find how to do it.)

也:由于wait_for_user_input()将被多次调用,所以最好不要重复启动和停止侦听器,而让它启动一次并停止一次?

Also : since wait_for_user_input() will be called multiple times, would it be better to not start and stop the listener repetitively, and instead have it start once and stop once ?

推荐答案

您可以将函数直接放在on_press中,然后就不需要while循环.您可能只需要listener.join()即可等待listener.stop()

You can put functions directly in on_press and then you don't need while loop. You may need only listener.join() which will wait for listener.stop()

from pynput import keyboard

def on_press(key):
    try:
        if key.char == "c":
            # do something
            return False  # Stop listener
        elif key.char == "v":
            # do something else
            return False  # Stop listener
    except AttributeError as ex:
        print(ex)

def on_release(key):
    if key == keyboard.Key.esc:
        # Stop listener
        return False

def wait_for_user_input():
    listener = keyboard.Listener(on_press=on_press, on_release=on_release)
    listener.start()
    listener.join() # wait till listener will stop
    # other stuff        


如果您需要运行功能而需要其他功能,那么您可以继续使用global user_input,但可以编写一些不同的内容.

If you need run functions which result you need in other functions then you may stay with global user_input but you can write it little different.

from pynput import keyboard

def on_press(key):
    global user_input

    try:
        if key.char in ("c", "v"):
            user_input = key.char
            return False  # Stop listener
    except AttributeError as ex:
        print(ex)

def on_release(key):
    if key == keyboard.Key.esc:
        return False  # Stop listener

def wait_for_user_input():
    listener = keyboard.Listener(on_press=on_press, on_release=on_release)
    listener.start()
    listener.join() # wait till listener will stop

    if user_input == "c":
        # do something
    elif user_input == "v":
        # do something else
    else:
        print('You pressed ESC ?')


编辑:如果您使用Windows,则可以使用msvcrt.getch,它给出了更短,更好的代码.


If you use Windows then you could use msvcrt.getch which gives shorter and nicer code.

from msvcrt import getch

def wait_for_user_input():

    while True:
        user_input = getch()
        if user_input == "c":
            print('selected: c')
            break
        elif user_input == "v":
            print('selected: v')
            break
        elif user_input == escape:
            print('You pressed ESC ?')
            break

wait_for_user_input()

对于Linux,该功能应与getch()类似,但代码应更长.

For Linux should be similar function getch() but with longer code.

另请参见模块 getch ,但我没有对其进行检查.

See also module getch but I didn't check it.

这篇关于用Pynput监听特定的按键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆