如何使 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,它将异步播放声音,这意味着它不会阻止您的脚本继续 运行。