Log response time for return/enter in inline script
Hi
I have made an experiment in which I use an inline_script.
I want to show my participants a sketchpad and at the same time let them give a multiple character response (i.e., they have to solve arithmetic items which are shown with the sketchpad; answers range from 25-112). They have to submit their answer by pressing the return/enter key.
Using different answers in this forum, I have come up with the following script (remark: my sketchpad is called "StimulusDisplay")
from openexp.canvas import canvas
from openexp.keyboard import keyboard
my_canvas = canvas(self.experiment)
my_keyboard = keyboard(self.experiment)
resp = "" # Here we store the response.
t1 = self.time()
while True:
# Get a keyboard response
key, time = my_keyboard.get_key()
# keyboard.to_chr() converts the keycode to a description,
# like 'space' or 'return'. If return is pressed the loop
# should be exited.
if my_keyboard.to_chr(key) == "return":
break
# Handle backspace by removing the last character
if my_keyboard.to_chr(key) == "backspace":
resp = resp[:-1]
else:
# The built-in chr() converts the keycode to a character,
# like ' ' and '/'.
resp += my_keyboard.to_chr(key)
# Copy the canvas from a sketchpad called 'StimulusDisplay' and
# overlay the response
my_canvas.copy(self.experiment.items["StimulusDisplay"].canvas)
my_canvas.text(resp, x=0, y=300)
my_canvas.show()
# Save the response
rt = time - t1
self.experiment.set("ANSWER", resp)
self.experiment.set("ANSWER_rt", rt)
There are several problems with my script.
- I am not sure if my response time variable (rt) gives me the response time for when the return key is pressed?
- My sketchpad disappears after the first key is pressed; i want it to stay until enter/return is pressed
- I want to use the numbers on the AZERTY keyboard, but I need the shift lock to be forced. I have no idea how to do this.
Sorry, I'm really new to Python.
HUGE THANKS IN ADVANCE!
Elien
Comments
Hi Elien,
Your code used a little outdated syntax of Opensesame, by now things can be done a little easier (see my code below). Also, it is somewhat better to present the sketchpad in the inline_script itself, basically the same way you show the response.
Hope it helps,
Eduard
my_canvas = Canvas() my_keyboard = Keyboard() resp = "" # Here we store the response. question = '25+85 = ?' my_canvas.text(question, x=0, y=-100) my_canvas['resp'] = Text('', x=0, y=300) my_canvas.show() t1 = self.time() while True: # Get a keyboard response key, time = my_keyboard.get_key(timeout = 4) if key != None: # keyboard.to_chr() converts the keycode to a description, # like 'space' or 'return'. If return is pressed the loop # should be exited. if key == "return": break # Handle backspace by removing the last character elif key == "backspace": resp = resp[:-1] my_canvas['resp'].text = resp my_canvas.show() elif key == "space": pass elif key in [0,1,2,3,4,5,6,7,8,9]: # The built-in chr() converts the keycode to a character, # like ' ' and '/'. resp += key # Copy the canvas from a sketchpad called 'StimulusDisplay' and # overlay the response my_canvas['resp'].text = resp my_canvas.show() # Save the response rt = time - t1 self.experiment.set("ANSWER", resp) self.experiment.set("ANSWER_rt", rt)