Hi,
I am wondering if anyone can help with a code snippet for controlling the slider with the keyboard?
I have tried using the following code:
arrowKeys = event.getKeys(keyList=[‘left’,‘right’])
if 'left' in arrowKeys:
slider.markerPos -= 1
if 'right' in arrowKeys:
slider.markerPos += 1
But when I run the experiment it says the event is undefined. Does anyone have a simple way to control the marker on the slider using the keyboard?
Many thanks for your help!
Hello LisaFitz,
the following worked for me offline:
Begin routine tab
event.clearEvents('keyboard')
slider.markerPos = 3
Each frame tab
keys = event.getKeys()
if len(keys):
if 'left' in keys:
slider.markerPos = slider.markerPos - 1
elif 'right' in keys:
slider.markerPos = slider.markerPos + 1
Best wishes Jens
3 Likes
Hi Jens,
Thanks so much for your reply!
I’ve tried to run that code but I am experiencing a similar error that clear events undefined. There must be something obvious I’m missing.
Many thanks,
Lisa
Hello LisaFitz
does your code-component follow the slider-component?
Best wishes Jens
1 Like
Hello Lisa,
do you test the experiment locally or on-line? In case you testing it on-line, you might want to add the following line to a Begin experiment tab JavaScript only code-component
event = psychoJS.eventManager;
Check wakecarter’s crib sheet for more information.
Best wishes Jens
Hi Jens,
Yes! I was just about to mention that I have JS only code components in my tasks so I need to run it online.
Thanks, I’ll try this!
Hi Jens,
Thank you so much for your time and advice. That worked! I can’t thank you enough 
Hello,
That is good news. Do you mind marking it as a solution? Then it will be found faster.
Best wishes Jens
1 Like
Hi Jens,
First of all, this has been extremely helpful for me as well, so thank you very much!
However, I have one question. When I use this solution slider.response is still ‘None’ on the .csv file on data. I get the participants’ answer from the log but it is not very elegant… I have tried with getHistory or getRating but they only work when I use the mouse to move the slider…
Not sure if you have any insights on this…
Thanks a lot in advance!
Pablo
Dear pablorom,
did you check the Store rating on the Data tab of the slider properties?
Rating responses are stored in the csv when this option is checked, at least in my case.
Best wishes Jens
1 Like
Hi Jens,
Thanks a lot for your response!
Yes, it is checked. I think that the problem might be that, in my task, the participants do not push a button to validate the response and that is why PsychoPy does not save the answer on the csv. The task will be used in an fMRI study and I will most likely use only two buttons (left and right). As you probably know, the mobility inside an fMRI scanner is limited and the will use one hand to hold a “panic button” to stop the machine and get them out, and the other hand to hold the two-button control pad with two buttons (left and right). They will have 10 seconds to answer each item and we will record the last position of the slider. Another option might be pressing both buttons (left and right) at once to validate the response but I am not sure how to do it…
Does this make sense to you?
BW,
Pablo
Hello,
set your slider to the duration you need and add the following to the End routine tab:
thisExp.addData("Rating", slider.markerPos)
The participant will be able to move the slider response to the desired point on the scale and then has simply to wait for the routine (presentation duration of the slider) to finish.
Best wishes Jens
1 Like
That worked, Jens, thank you very much, I really appreciate it!
BW,
Pablo
Before you leave this topic, I would like to use slider in Builder, but have the marker default to a particular value (like ‘marker start’ in the old Rating scale). From Pablo’s example I thought I could proceed the slider with a code segment like:
mySlider.markerPos = 6 #in Begin Routine
or
mySlider.markerPos = 6 #in Begin Routine
mySilder.draw()
I can get the slider to work perfectly but I would like it to default to a value & marker at that value. I have tried the code component both before and after the slider component. Thanks.
This should work but I think only if it occurs after the slider has started, so the code component would need to come below the slider, or you could put this in Each Frame. Something like
Begin Routine
slider_started = False
Each Frame
if slider_started == False:
slider_started = True
mySlider.markerPos = 6