问题描述
我想使用键盘快捷键Ctrl+Shift+H
启动python脚本。
脚本启动时,可能仍会按下键Ctrl
和Shift
(取决于我手指松动的速度)。
我想确保在执行脚本的其余部分之前释放这两个键。为此,我需要测试是否按下了键。
请注意,释放键时触发事件是不够的,因为脚本启动时可能不会按下键。
我发现了几个引用来检测何时在python中按下或释放了一个键,但是我没有找到一个可以测试是否按下了键的参考。
你知道我该怎么做吗?
编辑:这是一个最小的示例。 您可以找到here格式的文件,该文件可以在焦点所在的窗口中写入“ azerty”。如果在终端中键入以下命令,则会按预期在其中键入“ azerty”:
cnee --replay -sp 0 -f ./recorded_macro.xnl
为了在任何窗口(不仅是终端)中写“ azerty”,我创建了执行该命令的键盘快捷键Ctrl+Shift+H
。如果使用快捷方式,则在执行命令时很可能会按下键Ctrl
和Shift
(除非我很快使用快捷方式),而不是键入“ azerty”,而是焦点将得到Ctrl+Shift+a
,Ctrl+Shift+z
,Ctrl+Shift+e
,Ctrl+Shift+r
,Ctrl+Shift+t
和Ctrl+Shift+y
,这将触发窗口中的操作,但不会写入“ azerty”。
因此,我想改为使用此快捷方式启动python脚本,该脚本等待Ctrl
和Shift
在执行cnee
命令之前未被按下。再次注意,等待键与侦听器一起释放不是解决方案,因为如果我快速使用快捷键,则可能无法在python脚本开始时按下键Ctrl
和Shift
(并且因此在执行不需要的cnee命令之前,我将不得不再次按Ctrl
和Shift
。
解决方法
有阴茎
Controller().release()
库中的 pynput.keyboard
可释放按钮:
import subprocess
import time
from pynput.keyboard import Key,Controller
time.sleep(1)
keyboard = Controller()
keyboard.release(Key.shift)
keyboard.release(Key.ctrl)
subprocess.call(["cnee","--replay","-sp","0","-f","/home/user/recorded_macro.xnl"])
此解决方案很棒,因为它甚至不需要等待按钮被释放。
使用键盘(需要root权限)
keyboard.is_pressed()
库中的 keyboard
可测试是否按下了按钮:
import time
import keyboard
while keyboard.is_pressed('Shift') or keyboard.is_pressed('Ctrl'):
time.sleep(0.1)
但是该库必须是root用户,而且我不确定是否可以使用快捷方式触发root命令。
感谢@hc_dev提供的指针。