如何使 on_release 事件真正非阻塞输入?
How to make on_release events truly non-blocking inpynput?
我的用例是,我正在使用 pynput/Python 进行反应时间注册申请。其实质就是有人会按下一个控制键来标记第一个时间纪元,然后反应器敲击任何其他键,计算并显示两次击键之间的时间差。
为了提醒反应器按下一个键,当发起者释放他们的键时,我播放了大约 1 秒长的音调。然而,由于反应时间是毫秒级的,我不希望他们像目前必须的那样必须等待提示音结束才能按下按钮,或者甚至启动一组新的两次击键。一旦声音响起,您应该可以自由地按下更多键。
从这个意义上说,我不知道如何使事件成为非阻塞的。使用 listener.start()
范式似乎对我没有帮助。代码如下:
from pynput import keyboard
from datetime import datetime
from playsound import playsound
INITIATE = {keyboard.Key.enter}
def on_press(key):
global initiated_time
pressed_time = None
reaction_time = None
if key in INITIATE:
initiated_time = datetime.now()
return initiated_time
else:
pressed_time = datetime.now()
reaction_time = pressed_time - initiated_time
reaction_time_ms = int(reaction_time.seconds) * 1000 + int(reaction_time.microseconds)/1000
print('Reaction time %s ms' % (reaction_time_ms))
def on_release(key):
if key in INITIATE:
playsound('bong.mp3')
print('')
with keyboard.Listener(
on_press=on_press,
on_release=on_release
) as listener:
listener.join()
根据文档 here,playsound 有一个默认参数 block,如果设置为 False,它将异步播放声音,这意味着它不会阻止您的脚本继续 运行。
我的用例是,我正在使用 pynput/Python 进行反应时间注册申请。其实质就是有人会按下一个控制键来标记第一个时间纪元,然后反应器敲击任何其他键,计算并显示两次击键之间的时间差。
为了提醒反应器按下一个键,当发起者释放他们的键时,我播放了大约 1 秒长的音调。然而,由于反应时间是毫秒级的,我不希望他们像目前必须的那样必须等待提示音结束才能按下按钮,或者甚至启动一组新的两次击键。一旦声音响起,您应该可以自由地按下更多键。
从这个意义上说,我不知道如何使事件成为非阻塞的。使用 listener.start()
范式似乎对我没有帮助。代码如下:
from pynput import keyboard
from datetime import datetime
from playsound import playsound
INITIATE = {keyboard.Key.enter}
def on_press(key):
global initiated_time
pressed_time = None
reaction_time = None
if key in INITIATE:
initiated_time = datetime.now()
return initiated_time
else:
pressed_time = datetime.now()
reaction_time = pressed_time - initiated_time
reaction_time_ms = int(reaction_time.seconds) * 1000 + int(reaction_time.microseconds)/1000
print('Reaction time %s ms' % (reaction_time_ms))
def on_release(key):
if key in INITIATE:
playsound('bong.mp3')
print('')
with keyboard.Listener(
on_press=on_press,
on_release=on_release
) as listener:
listener.join()
根据文档 here,playsound 有一个默认参数 block,如果设置为 False,它将异步播放声音,这意味着它不会阻止您的脚本继续 运行。