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

标签 python audio tkinter

我是编程新手,对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/

相关文章:

python - Python 中最好的调度程序/回调库是什么?

字符串上的 Python 语法无效?

python - 如何在 pandas 的特定位置添加列?

c - 如何使用 ALSA 在缓冲区中录制声音

objective-c - 哪些Framework和Header文件包含kAudioUnitSubType_RemoteIO的常量

python - 我一辈子都无法扩展这个 ttk/tkinter 分隔符

Python/Tkinter制作自定义窗口

python - "Error: '::hypot ' has not been declared"在 cmath 中尝试嵌入 Python

python - 保持 tkinter Progressbar 运行直到创建文件

video - DirectShow 音频/视频 PTS 时钟计算