Keypress demoΒΆ

This example demonstrates the different keypress-gathering techniques available in the ExperimentController class.

keypress
exp_name: KeypressDemo
date: 2023-07-25 19_08_27.558117
file: /home/circleci/project/examples/experiments/keypress.py
participant: foo
session: 001
2023-07-25 19:08:27,558 - INFO    - Expyfun: Using version 2.0.0.dev0 (requested dev)
2023-07-25 19:08:27,559 - INFO    - Expyfun: Setting up sound card using pyglet backend with 2 playback channels
2023-07-25 19:08:27,756 - WARNING - Expyfun: Mismatch between reported stim sample rate (24414) and device sample rate (44100.0). Experiment Controller will resample for you, but this takes a non-trivial amount of processing time and may compromise your experimental timing and/or cause artifacts.
2023-07-25 19:08:27,756 - INFO    - Expyfun: Setting up screen
2023-07-25 19:08:27,785 - EXP     - Expyfun: Set screen visibility True
2023-07-25 19:08:27,793 - INFO    - Initialized [640 480] window on screen XlibScreen(display=<pyglet.canvas.xlib.XlibDisplay object at 0x7f1a95b502b0>, x=0, y=0, width=1400, height=900, xinerama=0) with DPI 69.73
2023-07-25 19:08:27,793 - INFO    - Expyfun: Initializing dummy triggering mode
2023-07-25 19:08:27,794 - INFO    - Expyfun: Initialization complete
2023-07-25 19:08:27,794 - EXP     - Expyfun: Participant: foo
2023-07-25 19:08:27,794 - EXP     - Expyfun: Session: 001
2023-07-25 19:08:31,377 - INFO    - Expyfun: Exiting
2023-07-25 19:08:31,379 - EXP     - Expyfun: Audio stopped and reset.

# Author: Dan McCloy <drmccloy@uw.edu>
#
# License: BSD (3-clause)

from expyfun import ExperimentController, building_doc
import expyfun.analyze as ea

print(__doc__)


isi = 0.5
wait_dur = 3.0 if not building_doc else 0.
msg_dur = 3.0 if not building_doc else 0.

with ExperimentController('KeypressDemo', screen_num=0,
                          window_size=[640, 480], full_screen=False,
                          stim_db=0, noise_db=0, output_dir=None,
                          participant='foo', session='001',
                          version='dev') as ec:
    ec.wait_secs(isi)

    ###############
    # screen_prompt
    pressed = ec.screen_prompt('press any key\n\nscreen_prompt('
                               'max_wait={})'.format(wait_dur),
                               max_wait=wait_dur, timestamp=True)
    ec.write_data_line('screen_prompt', pressed)
    if pressed[0] is None:
        message = 'no keys pressed'
    else:
        message = '{} pressed after {} secs'.format(pressed[0],
                                                    round(pressed[1], 4))
    ec.screen_prompt(message, msg_dur)
    ec.wait_secs(isi)

    ##################
    # wait_for_presses
    ec.screen_text('press some keys\n\nwait_for_presses(max_wait={})'
                   ''.format(wait_dur))
    screenshot = ec.screenshot()
    ec.flip()
    pressed = ec.wait_for_presses(wait_dur)
    ec.write_data_line('wait_for_presses', pressed)
    if not len(pressed):
        message = 'no keys pressed'
    else:
        message = ['{} pressed after {} secs\n'
                   ''.format(key, round(time, 4)) for key, time in pressed]
        message = ''.join(message)
    ec.screen_prompt(message, msg_dur)
    ec.wait_secs(isi)

    ############################################
    # wait_for_presses, relative to master clock
    ec.screen_text('press some keys\n\nwait_for_presses(max_wait={}, '
                   'relative_to=0.0)'.format(wait_dur))
    ec.flip()
    pressed = ec.wait_for_presses(wait_dur, relative_to=0.0)
    ec.write_data_line('wait_for_presses relative_to 0.0', pressed)
    if not len(pressed):
        message = 'no keys pressed'
    else:
        message = ['{} pressed at {} secs\n'
                   ''.format(key, round(time, 4)) for key, time in pressed]
        message = ''.join(message)
    ec.screen_prompt(message, msg_dur)
    ec.wait_secs(isi)

    ##########################################
    # listen_presses / wait_secs / get_presses
    ec.screen_text('press some keys\n\nlisten_presses()\nwait_secs({0})'
                   '\nget_presses()'.format(wait_dur))
    ec.flip()
    ec.listen_presses()
    ec.wait_secs(wait_dur)
    pressed = ec.get_presses()  # relative_to=0.0
    ec.write_data_line('listen / wait / get_presses', pressed)
    if not len(pressed):
        message = 'no keys pressed'
    else:
        message = ['{} pressed after {} secs\n'
                   ''.format(key, round(time, 4)) for key, time in pressed]
        message = ''.join(message)
    ec.screen_prompt(message, msg_dur)
    ec.wait_secs(isi)

    ####################################################################
    # listen_presses / wait_secs / get_presses, relative to master clock
    ec.screen_text('press a few keys\n\nlisten_presses()'
                   '\nwait_secs({0})\nget_presses(relative_to=0.0)'
                   ''.format(wait_dur))
    ec.flip()
    ec.listen_presses()
    ec.wait_secs(wait_dur)
    pressed = ec.get_presses(relative_to=0.0)
    ec.write_data_line('listen / wait / get_presses relative_to 0.0', pressed)
    if not len(pressed):
        message = 'no keys pressed'
    else:
        message = ['{} pressed at {} secs\n'
                   ''.format(key, round(time, 4)) for key, time in pressed]
        message = ''.join(message)
    ec.screen_prompt(message, msg_dur)
    ec.wait_secs(isi)

    ###########################################
    # listen_presses / while loop / get_presses
    disp_time = wait_dur
    countdown = ec.current_time + disp_time
    ec.call_on_next_flip(ec.listen_presses)
    ec.screen_text('press some keys\n\nlisten_presses()'
                   '\nwhile loop {}\nget_presses()'.format(disp_time))
    ec.flip()
    while ec.current_time < countdown:
        cur_time = round(countdown - ec.current_time, 1)
        if cur_time != disp_time:
            disp_time = cur_time
            # redraw text with updated disp_time
            ec.screen_text('press some keys\n\nlisten_presses() '
                           '\nwhile loop {}\nget_presses()'.format(disp_time))
            ec.flip()
    pressed = ec.get_presses()
    ec.write_data_line('listen / while / get_presses', pressed)
    if not len(pressed):
        message = 'no keys pressed'
    else:
        message = ['{} pressed after {} secs\n'
                   ''.format(key, round(time, 4)) for key, time in pressed]
        message = ''.join(message)
    ec.screen_prompt(message, msg_dur)
    ec.wait_secs(isi)

    #####################################################################
    # listen_presses / while loop / get_presses, relative to master clock
    disp_time = wait_dur
    countdown = ec.current_time + disp_time
    ec.call_on_next_flip(ec.listen_presses)
    ec.screen_text('press some keys\n\nlisten_presses()\nwhile loop '
                   '{}\nget_presses(relative_to=0.0)'.format(disp_time))
    ec.flip()
    while ec.current_time < countdown:
        cur_time = round(countdown - ec.current_time, 1)
        if cur_time != disp_time:
            disp_time = cur_time
            # redraw text with updated disp_time
            ec.screen_text('press some keys\n\nlisten_presses()\nwhile '
                           'loop {}\nget_presses(relative_to=0.0)'
                           ''.format(disp_time))
            ec.flip()
    pressed = ec.get_presses(relative_to=0.0)
    ec.write_data_line('listen / while / get_presses relative_to 0.0', pressed)
    if not len(pressed):
        message = 'no keys pressed'
    else:
        message = ['{} pressed at {} secs\n'
                   ''.format(key, round(time, 4)) for key, time in pressed]
        message = ''.join(message)
    ec.screen_prompt(message, msg_dur)

ea.plot_screen(screenshot)

Total running time of the script: ( 0 minutes 3.861 seconds)

Gallery generated by Sphinx-Gallery