问题描述
我正在研究需要用户交互的代码段:按下Esc
或按下Ctrl+Shift
。
我正在努力结合Ctrl+Shift
。下面的代码通过Esc
按钮可以正常工作。但是,当最初按Ctrl+Shift
时(在按Esc
之前)它不会打印任何内容,而至少按过一次Esc
后,它只对Shift
有效,但对Ctrl
-这不是我想要的。如何将Ctrl
和Shift
绑定在一起?
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()
解决方法
如果将print(key)
放在on_press
的开头,则会看到 CTRL 键会生成ctrl_l
或{{1} }键(取决于您所按下的键),不是一个ctrl_r
键。
因此,您要么必须处理它们中的任何一个,要么以一些可怕的ctrl
代码段结尾,或者仅在顶部进行翻译:
any/all/any
使用翻译功能if key == keyboard.Key.ctrl_l or key == keyboard.Key.ctrl_r:
key = keyboard.Key.ctrl
处理此问题的版本(用于 CTRL 和 SHIFT 键,因为后者似乎可以生成xlate()
)以及检测键的释放,如下所示:
shift/shift_r