2

私はプログラミングが初めてで、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 == 'Return': の下に置いたものは何でも 、サウンドが終了した後にのみ実行されます。これを克服する方法はありますか (あまり複雑ではないことを願っています)。
私が思いつく唯一の解決策は、非常に短い音(ミリ秒?)を取り、キーが押されるまでループすることです。

ありがとうございました。

4

1 に答える 1

3

別のスレッドでサウンドを開始する必要があります。

何かのようなもの:

import threading

#...

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

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

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

補足として、このようにグローバルな値をぶらぶらさせることは、最善の解決策ではありません。クラスは、さまざまな関数呼び出し間で状態を共有するための非常に優れた方法であるため、クラスについて読む必要があります。

于 2012-11-16T20:27:50.800 に答える