Python 中的 Ctrl+Shift 组合键

Ctrl+Shift key combination in Python

我正在编写一个需要用户交互的片段:Esc 按下或 Ctrl+Shift 按下。

虽然我正在努力合并 Ctrl+Shift。下面的代码适用于 Esc 按钮。然而,当最初按下 Ctrl+Shift 时(在按下 Esc 之前)它不会打印任何东西,而在按下 Esc 至少一次之后,它适用于 Shift 但不适用于Ctrl- 这不是我想要的。如何将 CtrlShift 绑定在一起?

from pynput import keyboard

COMBINATIONS = [
    { keyboard.Key.shift, keyboard.Key.ctrl },
    { keyboard.Key.esc }
]

# The currently active modifiers
current = set()

def execute():
    print ("Pressed!")

def on_press(key):
    if any([key in COMBO for COMBO in COMBINATIONS]):
        current.add(key)
        if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS):
            execute()

def on_release(key):
    try:
        current.remove(key)
    except KeyError:
        pass

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

如果您在 on_press 的开头放置 print(key),您会看到 CTRL 键生成 ctrl_lctrl_r 键(取决于您按下的是哪个键),不是 ctrl 键。

所以你要么必须处理其中任何一个,最终得到一些可怕的 any/all/any 代码片段,要么只在顶部翻译:

if key == keyboard.Key.ctrl_l or key == keyboard.Key.ctrl_r:
    key = keyboard.Key.ctrl

一个用翻译函数处理这个问题的版本xlate()(对于CTRL and SHIFT 键,因为后者似乎生成 shift/shift_r),以及检测键的释放,如下所示:

from pynput import keyboard

COMBINATIONS = [
    { keyboard.Key.shift, keyboard.Key.ctrl },
    { keyboard.Key.esc }
]

current = set()

def execute():
    print ("Pressed!")

def xlate(key):
    if key == keyboard.Key.ctrl_l or key == keyboard.Key.ctrl_r:
        return keyboard.Key.ctrl
    if key == keyboard.Key.shift_l or key == keyboard.Key.shift_r:
        return keyboard.Key.shift
    return key

def on_release(key):
    key = xlate(key)
    if key in current:
        current.remove(key)

def on_press(key):
    #print(key) # for debugging purposes.
    key = xlate(key)
    if any([key in COMBO for COMBO in COMBINATIONS]):
        current.add(key)
        if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS):
            execute()

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