2012-11-16 51 views
2

我新的编程,我有蟒蛇的了解甚少。我试图制作一个程序来测试生物学实验的听觉和视觉反应时间。 对于听觉部分,我在声音开始播放时启动计时器,受试者只要听到它就必须按下一个键。我的问题是,当声音仍在播放时,我无法执行其他任何操作,因此无法记录按下按键的时间。 这里是什么,我试图做一个简化版本:执行的按键事件,而玩在Python(Tkinter的)声音

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 ==“返回”划归:的声音结束后,才能执行。 有没有办法(希望不是很复杂)来克服这一点?
我能想出的唯一办法是,直到键被按下时采取了很短的声音(毫秒?),并循环播放。

谢谢。

回答

3

您需要启动一个单独的thread的声音。

类似:

import threading 

#... 

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

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

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

作为一个侧面说明,有全球价值观挂像,这不是最好的解决办法。你应该阅读类,因为它们是在各种函数调用之间共享状态的好方法。

+0

谢谢你的快速回答,它的工作原理。你能评论它有多准确吗?我读过time.time和time.clock,time.clock似乎更适合我的情况(对于windows)。但我不确定我的结果有多可靠。我为视觉测试做了同样的事情,只改变了背景。收到播放声音的指令和播放实际声音之间是否有延迟?和改变背景时的延迟有很大的不同吗?谢谢 – user1830663

+0

@ user1830663:当然有延迟。 – martineau

+0

我试图用timeit来验证它。是否仅包含winsound.PlaySound ...语句足够了?我跑了好几次,但我发现声音的持续时间本身就包含在我的时间之内。我是否应该知道这个声音有多长时间并且减去它?那垃圾收集呢?我不确定我是否应该启用它。 – user1830663