P S*_*nki 5 python keyboard callback keyboard-events pynput
我需要知道何时按下并按住(特定)键。检测后的用例相当简单。当按键被释放时,发送一个信号来停止回调(我已经知道了)。
以下是该算法的粗略方案:
def the_callback():
if key_held == the_hotkey:
someObj.start() # this class Obj works totally well so no issues here on
elif key_released == the_hotkey:
someObj.stop()
else:
# we don't care. continue looking for Keyboard events
# here any kinda listener or just a loop which passes events to the callback
Run Code Online (Sandbox Code Playgroud)
我应该提到,任何阻止执行的侦听器都可以,因为它将在自己的线程中运行(已经pynput.keyboard.Listener在线程中运行,所以不是问题)
我使用pynputand itpynput.keyboard.Listener来检测按键并相应地调用回调,但我无法检测按键何时被按下。
当前的解决方案大致如下:
# not real code. just rough scheme
def on_pressed(key):
if key == my_hotkey:
if running_already: # this part works well already
obj.stop()
else:
obj.start()
else:
# we don't care
with pynput.keyboard.Listener(on_press=on_pressed) as listener:
listener.join() # blocking call until SystemExit, `return False` from callback or `listener.stop()`
Run Code Online (Sandbox Code Playgroud)
我有一种非常强烈的感觉on_release=another_callback_that_handles_releases,我可以通过添加(在 中可用pynput.keyboard.listener)来完成这项工作。
也许通过存储最后一次已知按下的按键,并检查释放的按键是否与之前按下的热键相同,但我不确定我将如何处理它,这甚至可以工作吗?
然后我决定尝试一下keyboard(不同的库)。我编写了下面的代码,它可以检测按下的按键。下面的代码几乎实现了我想要的:
import keyboard as kb, time
while 1:
while kb.is_pressed('q'):
print('Key is held')
time.sleep(0.5) # sleep added just to stop it from spamming the stdout
else:
print('No it\'s Not')
time.sleep(0.5)
Run Code Online (Sandbox Code Playgroud)
该解决方案的问题是,它不太适合 OSX 和 Ubuntu。使用特殊键时存在一些问题。此外,我将热键存储为pynput.keyboard.Key.f7(例如)或,pynput.keyboard.KeyCode(char='s') # for character keys并且这些枚举具有与keyboard用于扫描密钥 ID 的值不同的值(使用keyboard.hook())。
我应该如何检测按下的按键。我更愿意使用它来实现这一点,pynput因为代码库的其余部分也使用它,但'keyboard也很好。我再次有一种感觉,使用on_press=a_callbackandon_release=another_callback这可能会实现,但我并不完全确定。最后,解决方案最好是跨平台的(我可以根据 的值使用三个不同的函数platform.system())。
您将如何实现这一目标?
这是我在 Isak 建议后尝试(和 MCVE)写的内容。这几乎完美地工作,只有 1 个缺陷。那就是它不会从程序启动时就监听按键。
由于某种未知的原因,它需要一些时间才能开始实际检测任何按键。好处是,一旦它第一次检测到按键,它就可以完美地工作。
我在那里缺少什么?
| 归档时间: |
|
| 查看次数: |
3957 次 |
| 最近记录: |