Python 中的 Ctrl+Shift 组合键
Ctrl+Shift key combination in Python
我正在编写一个需要用户交互的片段: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()
如果您在 on_press
的开头放置 print(key)
,您会看到 CTRL 键生成 ctrl_l
或 ctrl_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()
我正在编写一个需要用户交互的片段: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()
如果您在 on_press
的开头放置 print(key)
,您会看到 CTRL 键生成 ctrl_l
或 ctrl_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()