在python中播放声音时执行按键事件(tkinter)

时间:2012-11-16 20:25:30

标签: python audio tkinter

我是编程新手,对python知之甚少。我正在尝试制作一个能够测试生物学实验的听觉和视觉反应时间的程序。 对于听觉部分,我在声音开始播放时启动计时器,然后主体必须在听到声音时立即按下一个键。我的问题是,当声音仍在播放时,我无法执行任何其他操作,因此无法记录按下该键的时间。 这是我正在尝试做的简化版本:

from Tkinter import *
import time
import winsound

def chooseTest(event):
    global start
    if event.keysym == 'BackSpace':
       root.after(2000,playSound)
    elif event.keysym == 'Return':
       new_time = time.clock()
       elapsed = new_time - start
       print elapsed
    else:
       pass

def playSound():
    global start
    start = time.clock()
    winsound.PlaySound('SystemAsterisk', winsound.SND_ALIAS)

root=Tk()
root.overrideredirect(True)
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(),root.winfo_screenheight()))           
root.bind('<Key>',chooseTest)
root.mainloop()

无论我在 elif event.keysym =='返回'下放置什么:仅在声音结束后执行。 是否有某种方法(希望不是很复杂)来克服这个问题? 我能想出的唯一解决方案是采用非常短的声音(毫秒?)并将其循环直到按下该键。

谢谢。

1 个答案:

答案 0 :(得分:3)

您需要在单独的thread上启动声音。

类似的东西:

import threading

#...

def playSound():
    global start
    start = time.clock()

    def func(): 
        winsound.PlaySound('SystemAsterisk', winsound.SND_ALIAS)

    threading.Thread(target=func).start()

作为旁注,像这样拥有全球价值观并不是最好的解决方案。你应该阅读类,因为它们是在各种函数调用之间共享状态的一种非常好的方法。