gpt4 book ai didi

python - 检测一个键是否被按下 - python

转载 作者:行者123 更新时间:2023-12-04 07:46:19 48 4
gpt4 key购买 nike

我的用例

我需要知道何时按下并按住(特定)键。检测后的用例相当简单。释放按键时,发送信号以停止回调(我已经知道)。

期望的行为

这是算法的粗略方案:

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

我应该提到任何阻塞执行的监听器都可以,因为它会在自己的线程中运行(已经在线程中运行 pynput.keyboard.Listener 所以不是问题)

我尝试过的

我使用 pynput 及其 pynput.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()`

我有一种非常强烈的感觉,我可以通过添加 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)

这个解决方案的问题是,它不太适合 OSX 和 Ubuntu。它在使用特殊键时存在一些问题。此外,我将热键存储为 pynput.keyboard.Key.f7(例如)或 pynput.keyboard.KeyCode(char='s') # for character keys这些枚举的值与 keyboard 用来扫描键 ID(使用 keyboard.hook())的值不同。

最后一个问题

我应该如何检测被按住的键。我更喜欢使用 pynput 来实现这一点,因为代码库的其余部分使用它,但 'keyboard 也很好。我再次感觉到使用 on_press=a_callbackon_release=another_callback 可能会实现,但我对此并不完全确定。最后,该解决方案最好是跨平台的(我可以根据 platform.system() 的值使用三个不同的函数)。

您将如何实现它?

编辑-1

HERE是我在 Isak 的建议后作为尝试(和 MCVE)写的。这几乎完美地工作,只有 1 缺陷。那就是它不会从程序一开始就监听按键。

在开始实际检测任何按键之前,由于某些未知原因需要一些时间。好消息是,一旦它第一次检测到按键,它就可以完美运行。

我错过了什么?

最佳答案

尝试检查特定键上的 key_pressed 事件,直到事件变为 key_released。因此,当您检测到单击该键时,您将执行您的代码,而当它检测到该键被释放时,代码将停止

关于python - 检测一个键是否被按下 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67179470/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com