我是编程新手,对Python知之甚少。我正在尝试制作一个程序来测试生物学实验的听觉和视觉 react 时间。 对于听觉部分,我在声音开始播放时启动计时器,然后受试者必须在听到声音后立即按下按键。我的问题是,当声音仍在播放时,我无法执行任何其他操作,因此无法记录按下按键的时间。 这是我正在尝试做的事情的简化版本:
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 == 'Return': 下放置的内容,仅在声音结束后才会执行。
有什么方法(希望不是很复杂)来克服这个问题吗?
我能想到的唯一解决方案是采用非常短的声音(毫秒?)并循环播放直到按下按键。
谢谢。
最佳答案
您需要在单独的 thread 上启动声音.
类似于:
import threading
#...
def playSound():
global start
start = time.clock()
def func():
winsound.PlaySound('SystemAsterisk', winsound.SND_ALIAS)
threading.Thread(target=func).start()
顺便说一句,让全局值(value)观像这样徘徊并不是最好的解决方案。您应该阅读类,因为它们是在各种函数调用之间共享状态的非常好的方法。
关于python - 在python(tkinter)中播放声音时执行按键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13423906/