2015-04-14 3 views
1

Dans ma tâche, j'ai autorisé des réponses en utilisant le pavé numérique (par exemple 'num_1') ainsi que les numéros normaux en haut du clavier (par exemple '1'). Quand je demanderai plus tard des évaluations en utilisant ratingScale, j'aimerais que les deux options soient également disponibles, mais je ne sais pas comment y parvenir. En l'état, ratingScale n'accepte pas les réponses avec le pavé numérique. Je peux changer ceci avec respKeys, mais je devrais fournir "une liste de clefs à employer pour choisir des choix, dans l'ordre désiré". Cela signifie que je ne peux pas autoriser à la fois '1' et 'num_1' à sélectionner la première notation (par exemple, respKeys = ['1','num_1, '2', 'num_2', ...] '1' sélectionnerait la première note, 'num_1' la seconde, etc.). Suis-je vraiment bloqué avec respKeys = ['1','2','3','4','5'] ou respKeys = ['num_1','num_2','num_3','num_4','num_5']?psychopy ratingEchelle avec pavé numérique

Merci pour toute aide!

Répondre

2

Je ne pense pas qu'il existe des moyens intégrés pour visual.RatingScale de prendre plusieurs touches du clavier pour le même emplacement de l'échelle. Si vous utilisez un codeur, un piratage pourrait être d'utiliser event.getKeys() et visual.RatingScale.setMarkerPos(). Donc, pour un cas simple avec une échelle de notation à trois positions:

# Initiate psychopy stuff 
from psychopy import visual, event 
win = visual.Window() 
scale = visual.RatingScale(win, low=1, high=3) 

# A list of lists, each sublist being the keys which represents this location 
keysLocation = [['1', 'num_1'], ['2', 'num_2'], ['3', 'num_3']] 
respKeys = [key for keysLoc in keysLocation for key in keysLoc] # looks complicated but it simply flattens the list to be non-nested 

    # Present the ratingscale and wait for a response 
    currentPos = 1 
    while scale.noResponse: 
     response = event.getKeys(keyList=respKeys) # only accept respKeys 
     if response and response[0] in respKeys: 
      # Then loop through sublists and update currentPos to where the match is 
      for i, loc in enumerate(keysLocation): 
       if response[0] in loc: 
        currentPos = i 

     # Set the marker position and draw 
     scale.setMarkerPos(currentPos) 
     scale.draw() 
     win.flip() 

Ma solution semble compliquée mais la majeure partie est à peu près la manipulation de la liste keysLocation et de recherche pour les matchs. Désolé pour les noms de variables mauvais/ambigus mais je ne pourrais pas trouver quelque chose de mieux maintenant.

Cette solution pourrait probablement aussi fonctionner dans Builder. Supprimez simplement la substance "initiez psychopy", remplacez scale par le nom de votre RatingScale et collez le code dans un composant de code juste au-dessus de RatingScale.

+0

Fonctionne parfaitement, merci! –