pynput键盘侦听器在按下shift时返回shift,但不修改shift_pressed

时间:2017-06-08 17:36:25

标签: python python-3.x keyboard-events

我有一个简单的程序来熟悉使用pynput的键盘监听器。它的作用并不重要。重要的是,shift_pressed属性似乎永远不会更改为True。我的程序目前看起来像这样:

from pynput.keyboard import Controller, Listener

boo = True
keyboard = Controller()

fib_lst = [0, 1]


def on_press(key):
    print(key)
    print(keyboard.shift_pressed)


Listener(on_press=on_press).start()

while boo:
    nxt = fib_lst[-1] + fib_lst[-2]
    input(nxt)
    fib_lst.append(nxt)

我试图在on_press(或on_release)中做同样的事情:

def on_press(key):
    if key == Key.delete:
        if keyboard.shift_pressed:
            func1()

        else:
            func2()

此代码在按下shift时应执行func1,如果不是,则执行func2。但它目前仅执行func2,因为shift_pressed永远是假的。我可以采取哪些不同的方式让shift_pressed正常工作?

编辑1:更清楚地指定所需的最终结果。

编辑2:将附加字符串更改为两个不同的函数以增加清晰度。

编辑3:更改了最终问题的参数以匹配最近的示例

2 个答案:

答案 0 :(得分:0)

我不是百分之百确定,但是当我使用pynput时,我注意到我可以处理关键释放的动作,而不是按键,所以你可以尝试下面的事情:

from pynput import keyboard

def on_press(key):
    if key == keyboard.Key.shift: # handles if key press is shift
        print('foo', end='')

def on_release(key):
    if key == keyboard.Key.shift:
        print()
    elif key == keyboard.Key.delete:
        print('bar')
    elif key == keyboard.Key.esc:
        return False

def get_current_key_input():
    with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
        listener.join()

get_current_key_input()

如果您需要任何其他帮助,请告诉我您的具体动机。

答案 1 :(得分:0)

这是 pynput 1.3.5 文档中的错误。

各种修饰符状态属性(alt_pressedalt_gr_pressedctrl_pressedshift_pressed)仅反映Controller实例的状态;它保持一个内部修饰符状态,当按下各种键时应用该状态 - 例如从支持它的脚本中使用大写字符。

此状态与当前操作系统状态分开,只有在您使用该特定控制器发送按键时才会更改。

没有通用的 pynput 方法来检索当前的全局修饰符状态。