2016-12-20 3 views
0

私はPsychoPyを使用してEyeTrackerマシンの実験をコーディングしています。PsychoPyのユーザー入力に基づいて前進する試みを中止する

PsychoPyのGoogleグループで提案されているように、Builderビューを使用して実験の基本構造を作成し、スクリプトをコンパイルしてからコーダービューに変更を加えました。したがって、ユーザーの入力を処理する方法が生成されますPsychoPyによって。 Enterキーを押してユーザーが入力を書き留めてから次の質問に進む必要があるため、2つの主要な応答オブジェクトがあるため、最初のユーザーはユーザーの入力を収集し、2番目のユーザーはEnterキーを押すとトリガーします。たとえば:

 # *B1_P2_key_01* updates 
     if t >= 0.0 and B1_P2_key_01.status == NOT_STARTED: 
      # keep track of start time/frame for later 
      B1_P2_key_01.tStart = t # underestimates by a little under one frame 
      B1_P2_key_01.frameNStart = frameN # exact frame index 
      B1_P2_key_01.status = STARTED 
      # keyboard checking is just starting 
      win.callOnFlip(B1_P2_key_01.clock.reset) # t=0 on next screen flip 
     if B1_P2_key_01.status == STARTED: 
      #theseKeys = event.getKeys(keyList=['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']) 
      theseKeys = event.getKeys(keyList=['num_1', 'num_2', 'num_3', 'num_4', 'num_5', 'num_6', 'num_7', 'num_8', 'num_9', 'num_0']) 
      # check for quit: 
      if "escape" in theseKeys: 
       endExpNow = True 
      if len(theseKeys) > 0 and b1p2_counter < 3: # at least one key was pressed 
       B1_P2_key_01.keys.extend(theseKeys) # storing all keys 
       B1_P2_key_01.rt.append(B1_P2_key_01.clock.getTime()) 
       print "accepted key" 
       b1p2_counter += 1 

     # *B1_P2_key_02* updates 
     if t >= 0.0 and B1_P2_key_02.status == NOT_STARTED: 
      # keep track of start time/frame for later 
      B1_P2_key_02.tStart = t # underestimates by a little under one frame 
      B1_P2_key_02.frameNStart = frameN # exact frame index 
      B1_P2_key_02.status = STARTED 
      # keyboard checking is just starting 
      win.callOnFlip(B1_P2_key_02.clock.reset) # t=0 on next screen flip 
      event.clearEvents(eventType='keyboard') 
     if B1_P2_key_02.status == STARTED: 
      theseKeys = event.getKeys(keyList=['return']) 

      # check for quit: 
      if "escape" in theseKeys: 
       endExpNow = True 
      if len(theseKeys) > 0: # at least one key was pressed 
       B1_P2_key_02.keys = theseKeys[-1] # just the last key pressed 
       B1_P2_key_02.rt = B1_P2_key_02.clock.getTime() 
       # a response ends the routine 
       msg2='finish_b1p2_'+paths_list[imagecounter] 
       print msg2 
       #tracker.sendMessage(msg2) 
       continueRoutine = False 

は、私はそれが彼/彼女のタイプのように画面上に表示されるように、ユーザの入力を必要とすることに注意してください、そうで示唆したように私は、別のTextStimオブジェクトの使用に基づいたソリューションを実装しましたあまりにグループ:

 # *B1_P2_resp_01* updates 
     if t >= 0.0 and B1_P2_resp_01.status == NOT_STARTED: 
      # keep track of start time/frame for later 
      B1_P2_resp_01.tStart = t # underestimates by a little under one frame 
      B1_P2_resp_01.frameNStart = frameN # exact frame index 
      B1_P2_resp_01.setAutoDraw(True) 

     displaystring=" ".join(B1_P2_key_01.keys) #convert list of pressed keys to string 
     displaystring=displaystring.replace(' ','') #remove intermediate spaces 
     # Do some text cleanup...replacing key names with puntuation and effectively disabling keys like 'back','shift', etc. 
     displaystring=displaystring.replace('space',' ') 
     displaystring=displaystring.replace('comma',',') 
     displaystring=displaystring.replace('lshift','') 
     displaystring=displaystring.replace('rshift','') 
     displaystring=displaystring.replace('period','.') 
     displaystring=displaystring.replace('back','') 
     displaystring=displaystring.replace('num_1','1') 
     displaystring=displaystring.replace('num_2','2') 
     displaystring=displaystring.replace('num_3','3') 
     displaystring=displaystring.replace('num_4','4') 
     displaystring=displaystring.replace('num_5','5') 
     displaystring=displaystring.replace('num_6','6') 
     displaystring=displaystring.replace('num_7','7') 
     displaystring=displaystring.replace('num_8','8') 
     displaystring=displaystring.replace('num_9','9') 
     displaystring=displaystring.replace('num_0','0') 
     #displaystring=displaystring.replace('backspace','') 
     #set text of AnswerDisplay to modified string 
     B1_P2_resp_01.setText(displaystring) 
     #print displaystring 

は今ここに私の問題は、彼/彼女が何を入力していない場合進出からユーザーを防ぐ方法である、または提供される値は、与えられた範囲(例の外にある場合:値ができるだけで0から100まで)。私はそこにいくつかの選択肢があることを知っていますが、PsychoPyのデフォルトの構造とは異なる構造を使用しています。そして、私はこの入力コントロールを現在提供されているものに実装する必要があります。

私はEnterイベントを処理しようとしましたが、テキストオブジェクトは入力されたEnterキーをまだ記録していますので、テキストが変更されます。また、最初のkey_responseオブジェクトから制御しようとしましたが、Enterキーの処理を担当するもう1つのキーが機能しなくなりました。

要するに、このフォーマットに固執しながら、ユーザーが次の試行に進むことができるかどうかを判断するために、2番目のkey_responseオブジェクト(Enterキーを処理するオブジェクト)の条件を設定する必要があります。入力のオンスクリーン表示。

この件に関するヘルプをいただければ幸いです。

答えて

1

重要な部分は含まれていません。これは、最初のコードスニペットの周りのループです。このループは、おそらくcontinueRoutineは、ユーザーを押すが戻ったときにたまたまFalseに設定されるまでコードを実行します

while continueRoutine: 
     # Your code here 

...のようなものです。条件をもう1つ追加したいとします。したがって、次のようなものがあります。

displaystring = '' # to prevent carry-over from the last trial in the first iteration of the loop. 
continueRoutine = True # this is probably already set higher up in the script and could be ignored 
while continueRoutine and displaystring: 
    # your code here 

あなたは5秒の最小値を渡したい場合は、あなたが実際にジョナスを

while continueRoutine and displaystring and t < 5: 
+0

をするだろう、その部分はSOのポストのためにあまりにも長い間、それを避けるために、この記事に含まれていないが、はい、それらの命令は、そこにあなたが正しく言ったように。コードの特定の部分に条件を設定してテストしてみましょう。すべてがうまくいくなら、私はあなたに戻ってきます。 –

+0

もう一度@Jonas、このアプローチは100%正確ではありませんが、それは非常に近いです。 "while"ステートメントの表示条件を設定する問題は、displaystring要素がwhileをすぐに中断させることです(空の状態で初期化され、whileは中断条件として使用されます)。試しにすべてを表示しているので、それは完全にスキップされています。私はこれが正しい方向に私を指し示していると推測していますが、条件を設定するとループの内部でうまくいくはずです。 +1は私を正しい方向に向ける。私は完全な実用的な解決策を得たときに投稿します。ありがとうございました –

関連する問題