pynput Keyboard Listener returns shift 按下 shift 时,但不修改 shift_pressed

pynput Keyboard Listener returns shift when shift is pressed, but does not modify shift_pressed

我有一个简单的程序可以让我自己熟悉使用 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:更改了最后一个问题的参数以匹配最近的示例

我不是百分百确定,但是当我使用 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()

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

这是 pynput 1.3.5 文档中的错误。

各种修改器状态属性(alt_pressed, alt_gr_pressed, ctrl_pressed and shift_pressed) reflect only the state of the Controller 实例;它维护一个内部修改器状态,当按下各种键时应用该状态——例如,支持它的脚本中的大写字符。

此状态独立于当前操作系统状态,仅当您使用该特定控制器发送按键时才会更改。

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