psychopy 2024.2.4__py3-none-any.whl → 2025.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of psychopy might be problematic. Click here for more details.
- psychopy/CHANGELOG.txt +208 -4
- psychopy/LICENSE.txt +1 -1
- psychopy/VERSION +1 -1
- psychopy/__init__.py +10 -7
- psychopy/alerts/__init__.py +1 -1
- psychopy/alerts/_alerts.py +53 -17
- psychopy/alerts/_errorHandler.py +3 -4
- psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
- psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
- psychopy/alerts/alertsCatalogue/alertCategories.yaml +8 -1
- psychopy/alerts/alertsCatalogue/alertmsg.py +1 -1
- psychopy/alerts/alerttools.py +0 -16
- psychopy/app/Resources/betasplash.png +0 -0
- psychopy/app/Resources/betasplash@2x.png +0 -0
- psychopy/app/Resources/classic/case.png +0 -0
- psychopy/app/Resources/classic/case@2x.png +0 -0
- psychopy/app/Resources/classic/fileaudio.png +0 -0
- psychopy/app/Resources/classic/fileaudio@2x.png +0 -0
- psychopy/app/Resources/classic/filecss.png +0 -0
- psychopy/app/Resources/classic/filecss@2x.png +0 -0
- psychopy/app/Resources/classic/filecsv.png +0 -0
- psychopy/app/Resources/classic/filecsv@2x.png +0 -0
- psychopy/app/Resources/classic/filedesign.png +0 -0
- psychopy/app/Resources/classic/filedesign@2x.png +0 -0
- psychopy/app/Resources/classic/filefont.png +0 -0
- psychopy/app/Resources/classic/filefont@2x.png +0 -0
- psychopy/app/Resources/classic/filegit.png +0 -0
- psychopy/app/Resources/classic/filegit@2x.png +0 -0
- psychopy/app/Resources/classic/filehtml.png +0 -0
- psychopy/app/Resources/classic/filehtml@2x.png +0 -0
- psychopy/app/Resources/classic/fileimage.png +0 -0
- psychopy/app/Resources/classic/fileimage@2x.png +0 -0
- psychopy/app/Resources/classic/fileinfo.png +0 -0
- psychopy/app/Resources/classic/fileinfo@2x.png +0 -0
- psychopy/app/Resources/classic/filejs.png +0 -0
- psychopy/app/Resources/classic/filejs@2x.png +0 -0
- psychopy/app/Resources/classic/filejson.png +0 -0
- psychopy/app/Resources/classic/filejson@2x.png +0 -0
- psychopy/app/Resources/classic/filepkg.png +0 -0
- psychopy/app/Resources/classic/filepkg@2x.png +0 -0
- psychopy/app/Resources/classic/filepsyexp.png +0 -0
- psychopy/app/Resources/classic/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/classic/filepy.png +0 -0
- psychopy/app/Resources/classic/filepy@2x.png +0 -0
- psychopy/app/Resources/classic/filetxt.png +0 -0
- psychopy/app/Resources/classic/filetxt@2x.png +0 -0
- psychopy/app/Resources/classic/fileunknown.png +0 -0
- psychopy/app/Resources/classic/fileunknown@2x.png +0 -0
- psychopy/app/Resources/classic/filevideo.png +0 -0
- psychopy/app/Resources/classic/filevideo@2x.png +0 -0
- psychopy/app/Resources/classic/find.png +0 -0
- psychopy/app/Resources/classic/find@2x.png +0 -0
- psychopy/app/Resources/classic/loop.png +0 -0
- psychopy/app/Resources/classic/loop@2x.png +0 -0
- psychopy/app/Resources/classic/regex.png +0 -0
- psychopy/app/Resources/classic/regex@2x.png +0 -0
- psychopy/app/Resources/dark/case.png +0 -0
- psychopy/app/Resources/dark/case@2x.png +0 -0
- psychopy/app/Resources/dark/fileaudio.png +0 -0
- psychopy/app/Resources/dark/fileaudio@2x.png +0 -0
- psychopy/app/Resources/dark/filecss.png +0 -0
- psychopy/app/Resources/dark/filecss@2x.png +0 -0
- psychopy/app/Resources/dark/filecsv.png +0 -0
- psychopy/app/Resources/dark/filecsv@2x.png +0 -0
- psychopy/app/Resources/dark/filedesign.png +0 -0
- psychopy/app/Resources/dark/filedesign@2x.png +0 -0
- psychopy/app/Resources/dark/filefont.png +0 -0
- psychopy/app/Resources/dark/filefont@2x.png +0 -0
- psychopy/app/Resources/dark/filegit.png +0 -0
- psychopy/app/Resources/dark/filegit@2x.png +0 -0
- psychopy/app/Resources/dark/filehtml.png +0 -0
- psychopy/app/Resources/dark/filehtml@2x.png +0 -0
- psychopy/app/Resources/dark/fileimage.png +0 -0
- psychopy/app/Resources/dark/fileimage@2x.png +0 -0
- psychopy/app/Resources/dark/fileinfo.png +0 -0
- psychopy/app/Resources/dark/fileinfo@2x.png +0 -0
- psychopy/app/Resources/dark/filejs.png +0 -0
- psychopy/app/Resources/dark/filejs@2x.png +0 -0
- psychopy/app/Resources/dark/filejson.png +0 -0
- psychopy/app/Resources/dark/filejson@2x.png +0 -0
- psychopy/app/Resources/dark/filepkg.png +0 -0
- psychopy/app/Resources/dark/filepkg@2x.png +0 -0
- psychopy/app/Resources/dark/filepsyexp.png +0 -0
- psychopy/app/Resources/dark/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/dark/filepy.png +0 -0
- psychopy/app/Resources/dark/filepy@2x.png +0 -0
- psychopy/app/Resources/dark/filetxt.png +0 -0
- psychopy/app/Resources/dark/filetxt@2x.png +0 -0
- psychopy/app/Resources/dark/fileunknown.png +0 -0
- psychopy/app/Resources/dark/fileunknown@2x.png +0 -0
- psychopy/app/Resources/dark/filevideo.png +0 -0
- psychopy/app/Resources/dark/filevideo@2x.png +0 -0
- psychopy/app/Resources/dark/find.png +0 -0
- psychopy/app/Resources/dark/find@2x.png +0 -0
- psychopy/app/Resources/dark/loop.png +0 -0
- psychopy/app/Resources/dark/loop@2x.png +0 -0
- psychopy/app/Resources/dark/regex.png +0 -0
- psychopy/app/Resources/dark/regex@2x.png +0 -0
- psychopy/app/Resources/light/case.png +0 -0
- psychopy/app/Resources/light/case@2x.png +0 -0
- psychopy/app/Resources/light/fileaudio.png +0 -0
- psychopy/app/Resources/light/fileaudio@2x.png +0 -0
- psychopy/app/Resources/light/filecss.png +0 -0
- psychopy/app/Resources/light/filecss@2x.png +0 -0
- psychopy/app/Resources/light/filecsv.png +0 -0
- psychopy/app/Resources/light/filecsv@2x.png +0 -0
- psychopy/app/Resources/light/filedesign.png +0 -0
- psychopy/app/Resources/light/filedesign@2x.png +0 -0
- psychopy/app/Resources/light/filefont.png +0 -0
- psychopy/app/Resources/light/filefont@2x.png +0 -0
- psychopy/app/Resources/light/filegit.png +0 -0
- psychopy/app/Resources/light/filegit@2x.png +0 -0
- psychopy/app/Resources/light/filehtml.png +0 -0
- psychopy/app/Resources/light/filehtml@2x.png +0 -0
- psychopy/app/Resources/light/fileimage.png +0 -0
- psychopy/app/Resources/light/fileimage@2x.png +0 -0
- psychopy/app/Resources/light/fileinfo.png +0 -0
- psychopy/app/Resources/light/fileinfo@2x.png +0 -0
- psychopy/app/Resources/light/filejs.png +0 -0
- psychopy/app/Resources/light/filejs@2x.png +0 -0
- psychopy/app/Resources/light/filejson.png +0 -0
- psychopy/app/Resources/light/filejson@2x.png +0 -0
- psychopy/app/Resources/light/filepkg.png +0 -0
- psychopy/app/Resources/light/filepkg@2x.png +0 -0
- psychopy/app/Resources/light/filepsyexp.png +0 -0
- psychopy/app/Resources/light/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/light/filepy.png +0 -0
- psychopy/app/Resources/light/filepy@2x.png +0 -0
- psychopy/app/Resources/light/filetxt.png +0 -0
- psychopy/app/Resources/light/filetxt@2x.png +0 -0
- psychopy/app/Resources/light/fileunknown.png +0 -0
- psychopy/app/Resources/light/fileunknown@2x.png +0 -0
- psychopy/app/Resources/light/filevideo.png +0 -0
- psychopy/app/Resources/light/filevideo@2x.png +0 -0
- psychopy/app/Resources/light/find.png +0 -0
- psychopy/app/Resources/light/find@2x.png +0 -0
- psychopy/app/Resources/light/loop.png +0 -0
- psychopy/app/Resources/light/loop@2x.png +0 -0
- psychopy/app/Resources/light/regex.png +0 -0
- psychopy/app/Resources/light/regex@2x.png +0 -0
- psychopy/app/Resources/routine_templates/Basic.psyexp +0 -1
- psychopy/app/Resources/routine_templates/Misc.psyexp +0 -1
- psychopy/app/Resources/routine_templates/Online.psyexp +0 -2
- psychopy/app/Resources/routine_templates/Trials.psyexp +0 -1
- psychopy/app/Resources/splash.png +0 -0
- psychopy/app/Resources/splash@2x.png +0 -0
- psychopy/app/__init__.py +49 -8
- psychopy/app/__main__.py +3 -0
- psychopy/app/_psychopyApp.py +134 -125
- psychopy/app/builder/builder.py +42 -22
- psychopy/app/builder/dialogs/__init__.py +44 -11
- psychopy/app/builder/dialogs/dlgsCode.py +1 -1
- psychopy/app/builder/dialogs/dlgsConditions.py +1 -1
- psychopy/app/builder/dialogs/findDlg.py +106 -20
- psychopy/app/builder/dialogs/paramCtrls.py +42 -1
- psychopy/app/builder/validators.py +1 -1
- psychopy/app/coder/codeEditorBase.py +8 -8
- psychopy/app/coder/coder.py +32 -29
- psychopy/app/coder/fileBrowser.py +68 -22
- psychopy/app/coder/folding.py +1 -1
- psychopy/app/coder/psychoParser.py +1 -1
- psychopy/app/coder/repl.py +1 -1
- psychopy/app/coder/sourceTree.py +1 -1
- psychopy/app/connections/__init__.py +1 -1
- psychopy/app/connections/news.py +1 -1
- psychopy/app/connections/sendusage.py +1 -1
- psychopy/app/connections/updates.py +1 -1
- psychopy/app/console.py +1 -1
- psychopy/app/errorDlg.py +1 -1
- psychopy/app/frametracker.py +1 -1
- psychopy/app/idle.py +1 -1
- psychopy/app/jobs.py +5 -2
- psychopy/app/linuxconfig/__init__.py +1 -1
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +1514 -3259
- psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +3 -3
- psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_US/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +1 -1
- psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +3421 -2396
- psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +3 -3
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +2 -2
- psychopy/app/{builder/localizedStrings.py → localizedStrings.py} +173 -26
- psychopy/app/pavlovia_ui/__init__.py +1 -1
- psychopy/app/pavlovia_ui/_base.py +1 -1
- psychopy/app/pavlovia_ui/functions.py +1 -1
- psychopy/app/pavlovia_ui/menu.py +1 -1
- psychopy/app/pavlovia_ui/project.py +1 -1
- psychopy/app/pavlovia_ui/search.py +1 -1
- psychopy/app/pavlovia_ui/sync.py +1 -1
- psychopy/app/pavlovia_ui/user.py +1 -1
- psychopy/app/plugin_manager/dialog.py +34 -96
- psychopy/app/plugin_manager/packages.py +10 -14
- psychopy/app/plugin_manager/plugins.py +64 -4
- psychopy/app/preferencesDlg.py +12 -37
- psychopy/app/psychopyApp.py +130 -44
- psychopy/app/ribbon.py +1 -0
- psychopy/app/runner/runner.py +37 -15
- psychopy/app/runner/scriptProcess.py +11 -6
- psychopy/app/stdout/stdOutRich.py +9 -2
- psychopy/app/themes/fonts.py +1 -1
- psychopy/app/themes/icons.py +2 -38
- psychopy/app/ui/__init__.py +1 -1
- psychopy/app/utils.py +3 -3
- psychopy/assets/default.mp3 +0 -0
- psychopy/assets/fonts/NotoSans-Bold.ttf +0 -0
- psychopy/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Italic.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Regular.ttf +0 -0
- psychopy/assets/voicekeyThresholdStim.wav +0 -0
- psychopy/clock.py +4 -1
- psychopy/colors.py +2 -0
- psychopy/core.py +1 -1
- psychopy/data/base.py +1 -1
- psychopy/data/experiment.py +151 -46
- psychopy/data/routine.py +27 -1
- psychopy/data/staircase.py +2 -1
- psychopy/data/trial.py +62 -14
- psychopy/data/utils.py +1 -1
- psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +333 -218
- psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +261 -239
- psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +319 -180
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +204 -116
- psychopy/demos/builder/Experiments/BART/assets/background.jpg +0 -0
- psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/bart.psyexp +779 -866
- psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +242 -180
- psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +419 -406
- psychopy/demos/builder/Experiments/dragAndDrop/README.md +2 -37
- psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +460 -1204
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/blank_grid.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/make_shapes.psyexp +221 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/readme.md +4 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_1.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_10.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_2.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_3.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_4.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_5.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_6.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_7.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_8.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_9.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
- psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +583 -542
- psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +458 -427
- psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +588 -550
- psychopy/demos/builder/Experiments/stroop/stroop.psyexp +303 -207
- psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +390 -215
- psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +390 -215
- psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +357 -331
- psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +3 -2
- psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +287 -277
- psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +370 -320
- psychopy/demos/builder/Feature Demos/noise/noise.psyexp +452 -399
- psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +168 -133
- psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +4 -3
- psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +420 -392
- psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +917 -871
- psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
- psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +200 -0
- psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +25 -9
- psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +372 -361
- psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +25 -9
- psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +320 -235
- psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +790 -651
- psychopy/demos/builder/Hardware/camera/camera.psyexp +326 -246
- psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +432 -327
- psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +440 -321
- psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +190 -181
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +323 -312
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy.psyexp +360 -0
- psychopy/demos/builder/{Feature Demos/eyetracking/eyetracking.xml → Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp} +154 -140
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +329 -273
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy_legacy.psyexp +312 -0
- psychopy/demos/builder/Hardware/microphone/microphone.psyexp +450 -404
- psychopy/demos/builder/Hardware/pump/pump.psyexp +593 -329
- psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
- psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +336 -274
- psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +200 -149
- psychopy/demos/builder/Helper Tools/colors/colors.psyexp +300 -279
- psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +677 -564
- psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +214 -158
- psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +195 -146
- psychopy/demos/coder/experiment control/runtimeInfo.py +1 -1
- psychopy/devices/__init__.py +1 -1
- psychopy/event.py +1 -1
- psychopy/exceptions.py +1 -1
- psychopy/experiment/__init__.py +1 -1
- psychopy/experiment/_experiment.py +62 -16
- psychopy/experiment/components/__init__.py +1 -6
- psychopy/experiment/components/_base.py +44 -19
- psychopy/experiment/components/aperture/__init__.py +1 -1
- psychopy/experiment/components/brush/__init__.py +2 -2
- psychopy/experiment/components/button/__init__.py +24 -28
- psychopy/experiment/components/camera/__init__.py +38 -39
- psychopy/experiment/components/code/__init__.py +1 -1
- psychopy/experiment/components/dots/__init__.py +1 -1
- psychopy/experiment/components/eyetracker_record/__init__.py +7 -3
- psychopy/experiment/components/form/__init__.py +3 -3
- psychopy/experiment/components/grating/__init__.py +1 -1
- psychopy/experiment/components/image/__init__.py +1 -1
- psychopy/experiment/components/joyButtons/__init__.py +2 -2
- psychopy/experiment/components/joyButtons/virtualJoyButtons.py +1 -1
- psychopy/experiment/components/joystick/__init__.py +3 -3
- psychopy/experiment/components/joystick/virtualJoystick.py +1 -1
- psychopy/experiment/components/keyboard/__init__.py +98 -122
- psychopy/experiment/components/microphone/__init__.py +54 -98
- psychopy/experiment/components/mouse/__init__.py +92 -93
- psychopy/experiment/components/movie/__init__.py +28 -50
- psychopy/experiment/components/parallelOut/__init__.py +3 -3
- psychopy/experiment/components/polygon/__init__.py +2 -3
- psychopy/experiment/components/roi/__init__.py +2 -2
- psychopy/experiment/components/routineSettings/__init__.py +2 -0
- psychopy/experiment/components/serialOut/__init__.py +7 -7
- psychopy/experiment/components/settings/__init__.py +317 -313
- psychopy/experiment/components/settings/eyetracking.py +108 -0
- psychopy/experiment/components/slider/__init__.py +5 -5
- psychopy/experiment/components/sound/__init__.py +168 -78
- psychopy/experiment/components/soundsensor/__init__.py +361 -0
- psychopy/experiment/components/soundsensor/classic/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/classic/soundsensor@2x.png +0 -0
- psychopy/experiment/components/soundsensor/dark/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/dark/soundsensor@2x.png +0 -0
- psychopy/experiment/components/soundsensor/light/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/light/soundsensor@2x.png +0 -0
- psychopy/experiment/components/static/__init__.py +59 -33
- psychopy/experiment/components/text/__init__.py +2 -6
- psychopy/experiment/components/textbox/__init__.py +3 -7
- psychopy/experiment/components/unknown/__init__.py +2 -0
- psychopy/experiment/components/unknownPlugin/__init__.py +2 -0
- psychopy/experiment/exports.py +1 -1
- psychopy/experiment/flow.py +2 -2
- psychopy/experiment/localization.py +1 -1
- psychopy/experiment/loops.py +43 -10
- psychopy/experiment/params.py +6 -4
- psychopy/experiment/plugins.py +8 -1
- psychopy/experiment/py2js.py +1 -1
- psychopy/experiment/py2js_transpiler.py +1 -1
- psychopy/experiment/routines/__init__.py +1 -1
- psychopy/experiment/routines/_base.py +23 -24
- psychopy/experiment/routines/audioValidator/__init__.py +343 -0
- psychopy/experiment/routines/audioValidator/classic/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/classic/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/audioValidator/dark/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/dark/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/audioValidator/light/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/light/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/eyetracker_calibrate/__init__.py +76 -17
- psychopy/experiment/routines/eyetracker_validate/__init__.py +1 -1
- psychopy/experiment/routines/unknown/__init__.py +2 -0
- psychopy/experiment/routines/{photodiodeValidator → visualValidator}/__init__.py +89 -120
- psychopy/experiment/routines/visualValidator/classic/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/classic/visual_validator@2x.png +0 -0
- psychopy/experiment/routines/visualValidator/dark/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/dark/visual_validator@2x.png +0 -0
- psychopy/experiment/routines/visualValidator/light/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/light/visual_validator@2x.png +0 -0
- psychopy/experiment/utils.py +1 -1
- psychopy/gui/__init__.py +1 -1
- psychopy/gui/qtgui.py +15 -6
- psychopy/gui/wxgui.py +1 -1
- psychopy/hardware/__init__.py +0 -1
- psychopy/hardware/base.py +147 -16
- psychopy/hardware/bbtk/__init__.py +10 -16
- psychopy/hardware/brainproducts.py +7 -13
- psychopy/hardware/button.py +21 -2
- psychopy/hardware/buttonbox/__init__.py +1 -1
- psychopy/hardware/camera/__init__.py +16 -3
- psychopy/hardware/cedrus.py +5 -16
- psychopy/hardware/crs/__init__.py +1 -1
- psychopy/hardware/crs/bits.py +36 -33
- psychopy/hardware/crs/colorcal.py +8 -11
- psychopy/hardware/crs/optical.py +7 -10
- psychopy/hardware/crs/shaders.py +18 -5
- psychopy/hardware/emotiv.py +1 -1
- psychopy/hardware/emulator.py +11 -5
- psychopy/hardware/exceptions.py +86 -0
- psychopy/hardware/forp.py +18 -23
- psychopy/hardware/gammasci.py +8 -3
- psychopy/hardware/iolab.py +8 -19
- psychopy/hardware/joystick/__init__.py +865 -266
- psychopy/hardware/joystick/_base.py +251 -0
- psychopy/hardware/joystick/backend_glfw.py +306 -0
- psychopy/hardware/joystick/backend_pyglet.py +309 -0
- psychopy/hardware/joystick/mappings.py +287 -0
- psychopy/hardware/keyboard.py +4 -2
- psychopy/hardware/labhackers.py +1 -1
- psychopy/hardware/labjacks.py +9 -13
- psychopy/hardware/{photodiode.py → lightsensor.py} +146 -203
- psychopy/hardware/listener.py +9 -8
- psychopy/hardware/manager.py +24 -35
- psychopy/hardware/microphone.py +534 -154
- psychopy/hardware/minolta.py +14 -4
- psychopy/hardware/mouse/__init__.py +1 -1
- psychopy/hardware/photometer/__init__.py +2 -2
- psychopy/hardware/pr.py +14 -4
- psychopy/hardware/qmix.py +18 -27
- psychopy/hardware/serialdevice.py +43 -12
- psychopy/hardware/soundsensor.py +473 -0
- psychopy/hardware/spatial/__init__.py +231 -0
- psychopy/hardware/speaker.py +298 -36
- psychopy/hardware/triggerbox/__init__.py +1 -1
- psychopy/hardware/triggerbox/base.py +1 -1
- psychopy/hardware/triggerbox/parallel.py +1 -1
- psychopy/info.py +1 -1
- psychopy/iohub/client/__init__.py +17 -0
- psychopy/iohub/client/keyboard.py +5 -0
- psychopy/iohub/devices/eyetracker/__init__.py +10 -18
- psychopy/iohub/devices/eyetracker/calibration/procedure.py +15 -33
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +1 -0
- psychopy/iohub/devices/mouse/linux2.py +6 -1
- psychopy/iohub/devices/mouse/win32.py +5 -0
- psychopy/layout.py +1 -1
- psychopy/liaison.py +91 -39
- psychopy/locale_setup.py +11 -1
- psychopy/localization/__init__.py +1 -1
- psychopy/localization/_localization.py +1 -1
- psychopy/localization/messages.pot +2 -2
- psychopy/logging.py +14 -12
- psychopy/microphone.py +4 -3
- psychopy/misc.py +1 -1
- psychopy/monitors/MonitorCenter.py +3 -3
- psychopy/monitors/__init__.py +1 -1
- psychopy/monitors/calibData.py +1 -1
- psychopy/monitors/calibTools.py +3 -2
- psychopy/platform_specific/__init__.py +1 -1
- psychopy/platform_specific/darwin.py +1 -1
- psychopy/platform_specific/linux.py +1 -1
- psychopy/platform_specific/win32.py +1 -1
- psychopy/plugins/__init__.py +26 -17
- psychopy/plugins/util.py +65 -0
- psychopy/preferences/Darwin.spec +11 -3
- psychopy/preferences/FreeBSD.spec +11 -3
- psychopy/preferences/Linux.spec +11 -3
- psychopy/preferences/Windows.spec +11 -3
- psychopy/preferences/__init__.py +1 -1
- psychopy/preferences/baseNoArch.spec +11 -3
- psychopy/preferences/hints.py +78 -61
- psychopy/preferences/preferences.py +82 -13
- psychopy/projects/__init__.py +1 -1
- psychopy/projects/pavlovia.py +29 -13
- psychopy/scripts/psyexpCompile.py +1 -1
- psychopy/session.py +81 -8
- psychopy/sound/__init__.py +25 -10
- psychopy/sound/_base.py +134 -34
- psychopy/sound/audioclip.py +38 -15
- psychopy/sound/audiodevice.py +1 -1
- psychopy/sound/backend_ptb.py +53 -321
- psychopy/sound/backend_pygame.py +7 -3
- psychopy/sound/backend_pyo.py +53 -22
- psychopy/sound/backend_pysound.py +10 -27
- psychopy/sound/backend_sounddevice.py +33 -21
- psychopy/sound/exceptions.py +1 -1
- psychopy/sound/microphone.py +83 -5
- psychopy/sound/transcribe.py +3 -3
- psychopy/tests/data/test_basic_run.py +1 -0
- psychopy/tests/data/test_loaded_namespace/test_counterbalance.psyexp +142 -0
- psychopy/tests/data/test_loaded_namespace/test_custom_missing.psyexp +129 -0
- psychopy/tests/data/test_loaded_namespace/test_missing_counterbalance.psyexp +116 -0
- psychopy/tests/data/test_loaded_namespace/test_mix_exp.psyexp +181 -0
- psychopy/tests/data/test_loaded_namespace/test_mix_missing.psyexp +140 -0
- psychopy/tests/data/test_loaded_namespace/test_mix_name_calibration.psyexp +164 -0
- psychopy/tests/data/test_sounds/default_16000.wav +0 -0
- psychopy/tests/data/test_sounds/default_192000.wav +0 -0
- psychopy/tests/data/test_sounds/default_22050.wav +0 -0
- psychopy/tests/data/test_sounds/default_32000.wav +0 -0
- psychopy/tests/data/test_sounds/default_44100.wav +0 -0
- psychopy/tests/data/test_sounds/default_48000.wav +0 -0
- psychopy/tests/data/test_sounds/default_8000.wav +0 -0
- psychopy/tests/data/test_sounds/default_96000.wav +0 -0
- psychopy/tests/test_alerts/test_alerttools.py +2 -1
- psychopy/tests/test_app/test_command_line.py +65 -0
- psychopy/tests/test_data/test_TrialHandler2.py +18 -7
- psychopy/tests/test_demos/test_builder_demos.py +1 -1
- psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +5238 -4188
- psychopy/tests/test_experiment/needs_wx/test_components.py +1 -1
- psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
- psychopy/tests/test_experiment/test_components/test_all_components.py +1 -1
- psychopy/tests/test_experiment/test_components/test_base_components.py +26 -17
- psychopy/tests/test_experiment/test_experiment.py +96 -0
- psychopy/tests/test_experiment/test_loops.py +12 -4
- psychopy/tests/test_experiment/test_params.py +17 -4
- psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +2 -2
- psychopy/tests/test_hardware/test_photodiode.py +66 -0
- psychopy/tests/test_liaison/test_Liaison.py +4 -4
- psychopy/tests/test_misc/test_clock.py +2 -0
- psychopy/tests/test_misc/test_color.py +2 -0
- psychopy/tests/test_misc/test_event.py +1 -0
- psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
- psychopy/tests/test_sound/test_sound.py +111 -40
- psychopy/tests/test_tools/test_colorspacetools.py +24 -23
- psychopy/tests/test_tools/test_mathtools.py +9 -9
- psychopy/tests/test_tools/test_viewtools.py +101 -0
- psychopy/tests/test_validators/__init__.py +0 -0
- psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
- psychopy/tests/test_visual/test_all_stimuli.py +2 -2
- psychopy/tests/test_visual/test_basevisual.py +37 -7
- psychopy/tests/test_visual/test_button.py +2 -2
- psychopy/tests/test_visual/test_circle.py +10 -2
- psychopy/tests/test_visual/test_dots.py +1 -1
- psychopy/tests/test_visual/test_form.py +13 -13
- psychopy/tests/test_visual/test_gamma.py +3 -3
- psychopy/tests/test_visual/test_image.py +2 -2
- psychopy/tests/test_visual/test_progress.py +2 -2
- psychopy/tests/test_visual/test_roi.py +8 -2
- psychopy/tests/test_visual/test_shape.py +2 -2
- psychopy/tests/test_visual/test_slider.py +2 -2
- psychopy/tests/test_visual/test_target.py +2 -2
- psychopy/tests/test_visual/test_textbox.py +6 -8
- psychopy/tests/test_visual/test_winScalePos.py +6 -5
- psychopy/tests/test_visual/test_window.py +17 -0
- psychopy/tests/utils.py +51 -1
- psychopy/tools/__init__.py +1 -1
- psychopy/tools/arraytools.py +2 -2
- psychopy/tools/attributetools.py +52 -1
- psychopy/tools/audiotools.py +4 -1
- psychopy/tools/colorspacetools.py +6 -4
- psychopy/tools/coordinatetools.py +1 -1
- psychopy/tools/fileerrortools.py +21 -9
- psychopy/tools/filetools.py +2 -2
- psychopy/tools/fontmanager.py +47 -28
- psychopy/tools/gltools.py +2964 -558
- psychopy/tools/imagetools.py +1 -1
- psychopy/tools/mathtools.py +997 -127
- psychopy/tools/monitorunittools.py +7 -1
- psychopy/tools/movietools.py +1 -2
- psychopy/tools/pkgtools.py +157 -127
- psychopy/tools/plottools.py +1 -1
- psychopy/tools/rifttools.py +1 -1
- psychopy/tools/stereotools.py +1 -1
- psychopy/tools/stimulustools.py +172 -2
- psychopy/tools/stringtools.py +22 -2
- psychopy/tools/systemtools.py +1 -1
- psychopy/tools/typetools.py +1 -1
- psychopy/tools/unittools.py +1 -1
- psychopy/tools/versionchooser.py +3 -1
- psychopy/tools/viewtools.py +54 -70
- psychopy/tools/wizard.py +2 -2
- psychopy/validation/__init__.py +6 -0
- psychopy/validation/audio.py +74 -0
- psychopy/validation/visual.py +115 -0
- psychopy/visual/__init__.py +1 -4
- psychopy/visual/aperture.py +9 -6
- psychopy/visual/backends/__init__.py +1 -1
- psychopy/visual/backends/_base.py +1 -1
- psychopy/visual/backends/gamma.py +1 -1
- psychopy/visual/backends/glfwbackend.py +8 -12
- psychopy/visual/backends/pygamebackend.py +1 -1
- psychopy/visual/backends/pygletbackend.py +32 -11
- psychopy/visual/basevisual.py +93 -13
- psychopy/visual/brush.py +1 -1
- psychopy/visual/bufferimage.py +90 -10
- psychopy/visual/button.py +1 -1
- psychopy/visual/circle.py +12 -20
- psychopy/visual/custommouse.py +1 -1
- psychopy/visual/dot.py +80 -14
- psychopy/visual/elementarray.py +84 -10
- psychopy/visual/filters.py +1 -1
- psychopy/visual/form.py +43 -28
- psychopy/visual/grating.py +105 -25
- psychopy/visual/helpers.py +1 -1
- psychopy/visual/image.py +98 -20
- psychopy/visual/line.py +15 -25
- psychopy/visual/movie.py +1 -1
- psychopy/visual/movie2.py +4 -3
- psychopy/visual/movie3.py +4 -3
- psychopy/visual/movies/__init__.py +1 -1
- psychopy/visual/movies/frame.py +1 -1
- psychopy/visual/movies/metadata.py +1 -1
- psychopy/visual/movies/players/__init__.py +1 -1
- psychopy/visual/movies/players/_base.py +1 -1
- psychopy/visual/movies/players/ffpyplayer_player.py +2 -3
- psychopy/visual/nnlvs.py +9 -6
- psychopy/visual/noise.py +4 -16
- psychopy/visual/patch.py +4 -3
- psychopy/visual/pie.py +3 -14
- psychopy/visual/polygon.py +21 -28
- psychopy/visual/radial.py +4 -18
- psychopy/visual/ratingscale.py +4 -3
- psychopy/visual/rect.py +16 -25
- psychopy/visual/rift.py +8 -2
- psychopy/visual/secondorder.py +4 -16
- psychopy/visual/shaders.py +620 -286
- psychopy/visual/shape.py +281 -90
- psychopy/visual/simpleimage.py +1 -1
- psychopy/visual/slider.py +78 -25
- psychopy/visual/stim3d.py +5 -608
- psychopy/visual/text.py +13 -3
- psychopy/visual/textbox2/textbox2.py +188 -56
- psychopy/visual/vlcmoviestim.py +1 -1
- psychopy/visual/window.py +373 -200
- psychopy/web.py +1 -1
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/METADATA +9 -9
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/RECORD +653 -660
- psychopy/.DS_Store +0 -0
- psychopy/__init__.py.orig +0 -65
- psychopy/app/.DS_Store +0 -0
- psychopy/app/Resources/.DS_Store +0 -0
- psychopy/app/Resources/classic/filecsv16.png +0 -0
- psychopy/app/Resources/classic/fileimage16.png +0 -0
- psychopy/app/Resources/classic/fileunknown16.png +0 -0
- psychopy/app/Resources/dark/filecsv16.png +0 -0
- psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
- psychopy/app/Resources/dark/fileimage16.png +0 -0
- psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
- psychopy/app/Resources/dark/fileunknown16.png +0 -0
- psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
- psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
- psychopy/app/Resources/light/filecsv16.png +0 -0
- psychopy/app/Resources/light/filecsv16@2x.png +0 -0
- psychopy/app/Resources/light/fileimage16.png +0 -0
- psychopy/app/Resources/light/fileimage16@2x.png +0 -0
- psychopy/app/Resources/light/fileunknown16.png +0 -0
- psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
- psychopy/app/Resources/psychopySplash.png +0 -0
- psychopy/app/Resources/psychopySplash@2x.png +0 -0
- psychopy/app/builder/builder.py.orig +0 -3932
- psychopy/app/builder/dialogs/__init__.py.orig +0 -1679
- psychopy/app/builder/dialogs/paramCtrls.py.orig +0 -713
- psychopy/app/colorpicker/__init__.py.orig +0 -411
- psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN.po +0 -6127
- psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN_allFlagged.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN_allFlagged.po +0 -7366
- psychopy/core.py.orig +0 -169
- psychopy/demos/builder/.DS_Store +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/index.html +0 -23
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/randomisedBlocks-legacy-browsers.js +0 -423
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/randomisedBlocks.js +0 -427
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/chooseBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/facesBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/housesBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face01.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face02.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face03.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house01.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house02.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house03.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.py +0 -330
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks_lastrun.py +0 -330
- psychopy/demos/builder/Experiments/.DS_Store +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +0 -61
- psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +0 -91
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
- psychopy/demos/builder/Feature Demos/eyetracking/eyetracking.xsd +0 -120
- psychopy/demos/builder/Tools/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.csv +0 -38
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.log +0 -3418
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.psydat +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.csv +0 -2
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.log +0 -15
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.psydat +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual.psyexp +0 -323
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual.py +0 -562
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
- psychopy/demos/builder/Tools/gammaCalibration/questStairs.xlsx +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/resources/low_contrast.png +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/resources/make_2nd_order_tex.py +0 -59
- psychopy/demos/builder/Tools/gammaCalibration/resources/second_order_tex.png +0 -0
- psychopy/demos/coder/.DS_Store +0 -0
- psychopy/demos/coder/experiment control/info_gamma.pickle +0 -0
- psychopy/demos/coder/iohub/.iohpid +0 -1
- psychopy/demos/coder/iohub/eyetracking/.iohpid +0 -1
- psychopy/demos/coder/iohub/wintab/.DS_Store +0 -0
- psychopy/demos/coder/stimuli/.DS_Store +0 -0
- psychopy/demos/coder/stimuli/radialGratingContracting.py +0 -29
- psychopy/experiment/_experiment.py.orig +0 -1032
- psychopy/experiment/components/.DS_Store +0 -0
- psychopy/experiment/components/_base.py.orig +0 -823
- psychopy/experiment/components/form/.DS_Store +0 -0
- psychopy/experiment/components/microphone/__init__.py.orig +0 -490
- psychopy/experiment/components/settings/__init__.py.orig +0 -1337
- psychopy/experiment/components/textbox/__init__.py.orig +0 -310
- psychopy/experiment/components/webcam/.DS_Store +0 -0
- psychopy/experiment/components/webcam/light/.DS_Store +0 -0
- psychopy/experiment/loops.py.orig +0 -829
- psychopy/experiment/params.py.orig +0 -408
- psychopy/experiment/routine.py.orig +0 -503
- psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
- psychopy/hardware/.DS_Store +0 -0
- psychopy/hardware/brainproducts.py.orig +0 -680
- psychopy/hardware/iolab.py.orig +0 -238
- psychopy/hardware/serialport.py +0 -51
- psychopy/iohub/datastore/__init__.py.orig +0 -443
- psychopy/iohub/datastore/util.py.orig +0 -692
- psychopy/iohub/devices/mouse/darwin.py.orig +0 -427
- psychopy/iohub/devices/mouse/linux2.py.orig +0 -198
- psychopy/preferences/.DS_Store +0 -0
- psychopy/projects/pavlovia.py.orig +0 -1295
- psychopy/tests/.DS_Store +0 -0
- psychopy/tests/data/.DS_Store +0 -0
- psychopy/tests/data/TestCircle_fill_local.png +0 -0
- psychopy/tests/data/__test.png +0 -0
- psychopy/tests/data/aperture1_normHexbackground_local.png +0 -0
- psychopy/tests/data/aperture1_norm_local.png +0 -0
- psychopy/tests/data/aperture2_normHexbackground_local.png +0 -0
- psychopy/tests/data/beatandrcos_height_local.png +0 -0
- psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/beatandrcos_norm_local.png +0 -0
- psychopy/tests/data/beatandrcos_stencil_local.png +0 -0
- psychopy/tests/data/blend_add_height_local.png +0 -0
- psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
- psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
- psychopy/tests/data/blend_add_normNoShade_local.png +0 -0
- psychopy/tests/data/blend_add_norm_local.png +0 -0
- psychopy/tests/data/blend_add_stencil_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_height_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normNoShade_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_stencil_local.png +0 -0
- psychopy/tests/data/circleHex_height_local.png +0 -0
- psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
- psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
- psychopy/tests/data/circleHex_normNoShade_local.png +0 -0
- psychopy/tests/data/circleHex_norm_local.png +0 -0
- psychopy/tests/data/circleHex_stencil_local.png +0 -0
- psychopy/tests/data/color_comparison_local.png +0 -0
- psychopy/tests/data/corrFullRandom_local.csv +0 -16
- psychopy/tests/data/corrFullRandom_local.tsv +0 -6
- psychopy/tests/data/correctScript/.DS_Store +0 -0
- psychopy/tests/data/dots_height_local.png +0 -0
- psychopy/tests/data/dots_normAddBlend_local.png +0 -0
- psychopy/tests/data/dots_normHexbackground_local.png +0 -0
- psychopy/tests/data/dots_normNoShade_local.png +0 -0
- psychopy/tests/data/dots_norm_local.png +0 -0
- psychopy/tests/data/dots_stencil_local.png +0 -0
- psychopy/tests/data/elarray1_height_local.png +0 -0
- psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
- psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
- psychopy/tests/data/elarray1_norm_local.png +0 -0
- psychopy/tests/data/elarray1_stencil_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_height_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_stencil_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_height_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_stencil_local.png +0 -0
- psychopy/tests/data/gabor1_height_local.png +0 -0
- psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
- psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
- psychopy/tests/data/gabor1_normNoShade_local.png +0 -0
- psychopy/tests/data/gabor1_norm_local.png +0 -0
- psychopy/tests/data/gabor1_stencil_local.png +0 -0
- psychopy/tests/data/greyscale_normHexbackground_local.png +0 -0
- psychopy/tests/data/imageAndGauss_height_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normNoShade_local.png +0 -0
- psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
- psychopy/tests/data/imageAndGauss_stencil_local.png +0 -0
- psychopy/tests/data/movFrame1_stencil_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_height_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normNoShade_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_stencil_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_height_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normNoShade_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_stencil_local.png +0 -0
- psychopy/tests/data/numpyImage_height_local.png +0 -0
- psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
- psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
- psychopy/tests/data/numpyImage_normNoShade_local.png +0 -0
- psychopy/tests/data/numpyImage_norm_local.png +0 -0
- psychopy/tests/data/numpyImage_stencil_local.png +0 -0
- psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
- psychopy/tests/data/shape2_1_normHexbackground_local.png +0 -0
- psychopy/tests/data/shape2_1_normNoShade_local.png +0 -0
- psychopy/tests/data/shape2_1_norm_local.png +0 -0
- psychopy/tests/data/shape2_1_stencil_local.png +0 -0
- psychopy/tests/data/testLoopsBlocks.psyexp_local.py +0 -328
- psychopy/tests/data/text1_height_local.png +0 -0
- psychopy/tests/data/text1_normAddBlend_local.png +0 -0
- psychopy/tests/data/text1_normHexbackground_local.png +0 -0
- psychopy/tests/data/text1_norm_local.png +0 -0
- psychopy/tests/data/text1_stencil_local.png +0 -0
- psychopy/tests/data/text2_height.png +0 -0
- psychopy/tests/data/text2_normAddBlend.png +0 -0
- psychopy/tests/data/text2_normHexbackground.png +0 -0
- psychopy/tests/data/text2_stencil.png +0 -0
- psychopy/tests/data/wedge1_height_local.png +0 -0
- psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
- psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
- psychopy/tests/data/wedge1_normNoShade_local.png +0 -0
- psychopy/tests/data/wedge1_norm_local.png +0 -0
- psychopy/tests/data/wedge1_stencil_local.png +0 -0
- psychopy/tests/test_app/.DS_Store +0 -0
- psychopy/tests/test_app/test_builder/.DS_Store +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.csv +0 -9
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.log +0 -177
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.psydat +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.xlsx +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.csv +0 -9
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.log +0 -168
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.psydat +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.xlsx +0 -0
- psychopy/tests/test_data/.DS_Store +0 -0
- psychopy/tests/test_hardware/test_CRS_BitsSharp.py +0 -67
- psychopy/tests/test_hardware/test_CRS_BitsSharp.py.orig +0 -68
- psychopy/tests/test_hardware/test_CRS_bitsShaders.py +0 -110
- psychopy/tests/test_visual/test_image.py.orig +0 -219
- psychopy/visual/basevisual.py.orig +0 -1723
- psychopy/visual/form.py.orig +0 -1181
- psychopy/visual/text.py.orig +0 -752
- psychopy/visual/textbox2/textbox2.py.orig +0 -1315
- psychopy/visual/windowwarp.py.orig +0 -463
- /psychopy/{app/cortex.log → alerts/alertsCatalogue/3600.yaml} +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Bold.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-BoldItalic.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Italic.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Regular.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/DejaVuSerif.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/IndieFlower-Regular.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
- /psychopy/demos/builder/Experiments/{GoNoGo → goNoGo}/readme.md +0 -0
- /psychopy/{demos/builder/Tools/gammaCalibration/readme.md → tests/test_plugins/__init__.py} +0 -0
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/WHEEL +0 -0
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/entry_points.txt +0 -0
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -16,6 +16,7 @@ class EyetrackerCalibrationRoutine(BaseStandaloneRoutine):
|
|
|
16
16
|
def __init__(self, exp, name='calibration',
|
|
17
17
|
progressMode="time", targetDur=1.5, expandDur=1, expandScale=1.5,
|
|
18
18
|
movementAnimation=True, movementDur=1.0, targetDelay=1.0,
|
|
19
|
+
useCustom=False, customTarget="",
|
|
19
20
|
innerFillColor='green', innerBorderColor='black', innerBorderWidth=2, innerRadius=0.0035,
|
|
20
21
|
fillColor='', borderColor="black", borderWidth=2, outerRadius=0.01,
|
|
21
22
|
colorSpace="rgb", units='from exp settings',
|
|
@@ -27,6 +28,10 @@ class EyetrackerCalibrationRoutine(BaseStandaloneRoutine):
|
|
|
27
28
|
self.url = "https://psychopy.org/builder/components/eyetracker_calibration.html"
|
|
28
29
|
|
|
29
30
|
self.exp.requirePsychopyLibs(['iohub', 'hardware'])
|
|
31
|
+
self.exp.requireImport(
|
|
32
|
+
importName="EyetrackerCalibration",
|
|
33
|
+
importFrom="psychopy.hardware.eyetracker"
|
|
34
|
+
)
|
|
30
35
|
|
|
31
36
|
# Basic params
|
|
32
37
|
self.order += [
|
|
@@ -41,7 +46,7 @@ class EyetrackerCalibrationRoutine(BaseStandaloneRoutine):
|
|
|
41
46
|
self.params['targetLayout'] = Param(targetLayout,
|
|
42
47
|
valType='str', inputType="choice", categ='Basic',
|
|
43
48
|
allowedVals=['THREE_POINTS', 'FIVE_POINTS', 'NINE_POINTS', "THIRTEEN_POINTS"],
|
|
44
|
-
hint=_translate("
|
|
49
|
+
hint=_translate("How many targets do you want to be presented for calibration? Points will be displayed in a grid."),
|
|
45
50
|
label=_translate("Target layout"))
|
|
46
51
|
|
|
47
52
|
self.params['randomisePos'] = Param(randomisePos,
|
|
@@ -54,6 +59,8 @@ class EyetrackerCalibrationRoutine(BaseStandaloneRoutine):
|
|
|
54
59
|
label=_translate("Text color"))
|
|
55
60
|
# Target Params
|
|
56
61
|
self.order += [
|
|
62
|
+
"useCustom",
|
|
63
|
+
"customTarget",
|
|
57
64
|
"targetStyle",
|
|
58
65
|
"fillColor",
|
|
59
66
|
"borderColor",
|
|
@@ -66,6 +73,31 @@ class EyetrackerCalibrationRoutine(BaseStandaloneRoutine):
|
|
|
66
73
|
"innerRadius",
|
|
67
74
|
]
|
|
68
75
|
|
|
76
|
+
self.params['useCustom'] = Param(
|
|
77
|
+
useCustom, valType="code", inputType="bool", categ="Target",
|
|
78
|
+
label=_translate("Use custom?"),
|
|
79
|
+
hint=_translate(
|
|
80
|
+
"Check this box to use a custom stimulus as a calibration target, rather than "
|
|
81
|
+
"creating one from params."
|
|
82
|
+
),
|
|
83
|
+
direct=False
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
self.params['customTarget'] = Param(
|
|
87
|
+
customTarget, valType="code", inputType="single", categ="Target",
|
|
88
|
+
label=_translate("Custom target"),
|
|
89
|
+
hint=_translate(
|
|
90
|
+
"Give the name of any visual Component to use it as a calibration target."
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
self.depends.append({
|
|
94
|
+
"dependsOn": 'useCustom', # if...
|
|
95
|
+
"condition": "", # meets...
|
|
96
|
+
"param": 'customTarget', # then...
|
|
97
|
+
"true": "show", # should...
|
|
98
|
+
"false": "hide", # otherwise...
|
|
99
|
+
})
|
|
100
|
+
|
|
69
101
|
self.params['innerFillColor'] = Param(innerFillColor,
|
|
70
102
|
valType='color', inputType="color", categ='Target',
|
|
71
103
|
hint=_translate("Fill color of the inner part of the target"),
|
|
@@ -118,6 +150,27 @@ class EyetrackerCalibrationRoutine(BaseStandaloneRoutine):
|
|
|
118
150
|
allowedVals=['from exp settings'], direct=False,
|
|
119
151
|
hint=_translate("Units of dimensions for this stimulus"),
|
|
120
152
|
label=_translate("Spatial units"))
|
|
153
|
+
# hide all target params if using custom
|
|
154
|
+
for thisParam in (
|
|
155
|
+
"targetStyle",
|
|
156
|
+
"fillColor",
|
|
157
|
+
"borderColor",
|
|
158
|
+
"innerFillColor",
|
|
159
|
+
"innerBorderColor",
|
|
160
|
+
"colorSpace",
|
|
161
|
+
"borderWidth",
|
|
162
|
+
"innerBorderWidth",
|
|
163
|
+
"outerRadius",
|
|
164
|
+
"innerRadius",
|
|
165
|
+
"units",
|
|
166
|
+
):
|
|
167
|
+
self.depends.append({
|
|
168
|
+
"dependsOn": 'useCustom', # if...
|
|
169
|
+
"condition": "", # meets...
|
|
170
|
+
"param": thisParam, # then...
|
|
171
|
+
"true": "hide", # should...
|
|
172
|
+
"false": "show", # otherwise...
|
|
173
|
+
})
|
|
121
174
|
|
|
122
175
|
# Animation Params
|
|
123
176
|
self.order += [
|
|
@@ -230,29 +283,35 @@ class EyetrackerCalibrationRoutine(BaseStandaloneRoutine):
|
|
|
230
283
|
|
|
231
284
|
BaseStandaloneRoutine.writeMainCode(self, buff)
|
|
232
285
|
|
|
233
|
-
#
|
|
286
|
+
# make target
|
|
234
287
|
code = (
|
|
235
288
|
"# define target for %(name)s\n"
|
|
236
|
-
"%(name)sTarget = visual.TargetStim(win, \n"
|
|
237
|
-
)
|
|
238
|
-
buff.writeIndentedLines(code % inits)
|
|
239
|
-
buff.setIndentLevel(1, relative=True)
|
|
240
|
-
code = (
|
|
241
|
-
"name='%(name)sTarget',\n"
|
|
242
|
-
"radius=%(outerRadius)s, fillColor=%(fillColor)s, borderColor=%(borderColor)s, lineWidth=%(borderWidth)s,\n"
|
|
243
|
-
"innerRadius=%(innerRadius)s, innerFillColor=%(innerFillColor)s, innerBorderColor=%(innerBorderColor)s, innerLineWidth=%(innerBorderWidth)s,\n"
|
|
244
|
-
"colorSpace=%(colorSpace)s, units=%(units)s\n"
|
|
245
|
-
)
|
|
246
|
-
buff.writeIndentedLines(code % inits)
|
|
247
|
-
buff.setIndentLevel(-1, relative=True)
|
|
248
|
-
code = (
|
|
249
|
-
")"
|
|
250
289
|
)
|
|
290
|
+
if self.params['useCustom']:
|
|
291
|
+
code += (
|
|
292
|
+
"%(name)sTarget = %(customTarget)s\n"
|
|
293
|
+
)
|
|
294
|
+
else:
|
|
295
|
+
code += (
|
|
296
|
+
"%(name)sTarget = visual.TargetStim(win, \n"
|
|
297
|
+
" name='%(name)sTarget',\n"
|
|
298
|
+
" radius=%(outerRadius)s, \n"
|
|
299
|
+
" fillColor=%(fillColor)s, \n"
|
|
300
|
+
" borderColor=%(borderColor)s, \n"
|
|
301
|
+
" lineWidth=%(borderWidth)s, \n"
|
|
302
|
+
" innerRadius=%(innerRadius)s, \n"
|
|
303
|
+
" innerFillColor=%(innerFillColor)s, \n"
|
|
304
|
+
" innerBorderColor=%(innerBorderColor)s, \n"
|
|
305
|
+
" innerLineWidth=%(innerBorderWidth)s,\n"
|
|
306
|
+
" colorSpace=%(colorSpace)s, \n"
|
|
307
|
+
" units=%(units)s\n"
|
|
308
|
+
")\n"
|
|
309
|
+
)
|
|
251
310
|
buff.writeIndentedLines(code % inits)
|
|
252
311
|
# Make config object
|
|
253
312
|
code = (
|
|
254
313
|
"# define parameters for %(name)s\n"
|
|
255
|
-
"%(name)s =
|
|
314
|
+
"%(name)s = EyetrackerCalibration(win, \n"
|
|
256
315
|
)
|
|
257
316
|
buff.writeIndentedLines(code % inits)
|
|
258
317
|
buff.setIndentLevel(1, relative=True)
|
|
@@ -61,7 +61,7 @@ class EyetrackerValidationRoutine(BaseStandaloneRoutine):
|
|
|
61
61
|
self.params['targetLayout'] = Param(targetLayout,
|
|
62
62
|
valType='str', inputType="choice", categ='Basic',
|
|
63
63
|
allowedVals=positions + ["CUSTOM..."],
|
|
64
|
-
hint=_translate("
|
|
64
|
+
hint=_translate("How many targets do you want to be presented for calibration? Points will be displayed in a grid."),
|
|
65
65
|
label=_translate("Target layout"))
|
|
66
66
|
|
|
67
67
|
self.depends.append(
|
|
@@ -7,6 +7,8 @@ class UnknownRoutine(BaseStandaloneRoutine):
|
|
|
7
7
|
targets = []
|
|
8
8
|
iconFile = Path(__file__).parent / "unknown.png"
|
|
9
9
|
tooltip = "Unknown routine"
|
|
10
|
+
# hide from the Components panel
|
|
11
|
+
hidden = True
|
|
10
12
|
|
|
11
13
|
def __init__(self, exp, name=''):
|
|
12
14
|
BaseStandaloneRoutine.__init__(self, exp, name=name)
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
from pathlib import Path
|
|
5
|
+
from psychopy.alerts._alerts import alert
|
|
5
6
|
from psychopy.experiment import Param
|
|
6
7
|
from psychopy.experiment.plugins import PluginDevicesMixin, DeviceBackend
|
|
7
8
|
from psychopy.experiment.components import getInitVals
|
|
@@ -9,86 +10,62 @@ from psychopy.experiment.routines import Routine, BaseValidatorRoutine
|
|
|
9
10
|
from psychopy.localization import _translate
|
|
10
11
|
|
|
11
12
|
|
|
12
|
-
class
|
|
13
|
+
class VisualValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
13
14
|
"""
|
|
14
|
-
Use a
|
|
15
|
+
Use a light sensor to confirm that visual stimuli are presented when they should be.
|
|
15
16
|
"""
|
|
16
17
|
targets = ['PsychoPy']
|
|
17
18
|
|
|
18
19
|
categories = ['Validation']
|
|
19
|
-
iconFile = Path(__file__).parent / '
|
|
20
|
-
tooltip = _translate(
|
|
20
|
+
iconFile = Path(__file__).parent / 'visual_validator.png'
|
|
21
|
+
tooltip = _translate(
|
|
22
|
+
"Use a light sensor to confirm that visual stimuli are presented when they should be."
|
|
23
|
+
)
|
|
21
24
|
deviceClasses = []
|
|
22
25
|
version = "2025.1.0"
|
|
23
26
|
|
|
24
27
|
def __init__(
|
|
25
28
|
self,
|
|
26
29
|
# basic
|
|
27
|
-
exp, name='
|
|
28
|
-
|
|
29
|
-
findThreshold=True, threshold=127,
|
|
30
|
+
exp, name='visualVal',
|
|
31
|
+
findThreshold=True, threshold=0.5,
|
|
30
32
|
# layout
|
|
31
|
-
|
|
33
|
+
findSensor=True, sensorPos="(1, 1)", sensorSize="(0.1, 0.1)", sensorUnits="norm",
|
|
32
34
|
# device
|
|
33
|
-
deviceLabel="", deviceBackend="screenbuffer",
|
|
34
|
-
# data
|
|
35
|
-
saveValid=True,
|
|
35
|
+
deviceLabel="", deviceBackend="screenbuffer", channel="0",
|
|
36
36
|
):
|
|
37
37
|
|
|
38
38
|
self.exp = exp # so we can access the experiment if necess
|
|
39
39
|
self.params = {}
|
|
40
40
|
self.depends = []
|
|
41
|
-
super(
|
|
41
|
+
super(VisualValidatorRoutine, self).__init__(exp, name=name)
|
|
42
42
|
self.order += []
|
|
43
|
-
self.type = '
|
|
43
|
+
self.type = 'VisualValidator'
|
|
44
44
|
|
|
45
|
-
exp.
|
|
46
|
-
importName="photodiode",
|
|
47
|
-
importFrom="psychopy.hardware",
|
|
48
|
-
importAs="phd"
|
|
49
|
-
)
|
|
45
|
+
exp.requirePsychopyLibs(['validation'])
|
|
50
46
|
|
|
51
47
|
# --- Basic ---
|
|
52
48
|
self.order += [
|
|
53
|
-
"variability",
|
|
54
|
-
"report",
|
|
55
49
|
"findThreshold",
|
|
56
50
|
"threshold",
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
51
|
+
"findSensor",
|
|
52
|
+
"sensorPos",
|
|
53
|
+
"sensorSize",
|
|
54
|
+
"sensorUnits",
|
|
61
55
|
]
|
|
62
|
-
|
|
63
|
-
self.params['variability'] = Param(
|
|
64
|
-
variability, valType="code", inputType="single", categ="Basic",
|
|
65
|
-
label=_translate("Variability (s)"),
|
|
66
|
-
hint=_translate(
|
|
67
|
-
"How much variation from intended presentation times (in seconds) is acceptable?"
|
|
68
|
-
)
|
|
69
|
-
)
|
|
70
|
-
self.params['report'] = Param(
|
|
71
|
-
report, valType="str", inputType="choice", categ="Basic",
|
|
72
|
-
allowedVals=["log", "err"],
|
|
73
|
-
allowedLabels=[_translate("Log warning"), _translate("Raise error")],
|
|
74
|
-
label=_translate("On fail..."),
|
|
75
|
-
hint=_translate(
|
|
76
|
-
"What to do when the validation fails. Just log, or stop the script and raise an error?"
|
|
77
|
-
)
|
|
78
|
-
)
|
|
79
56
|
self.params['findThreshold'] = Param(
|
|
80
57
|
findThreshold, valType="bool", inputType="bool", categ="Basic",
|
|
81
58
|
label=_translate("Find best threshold?"),
|
|
82
59
|
hint=_translate(
|
|
83
|
-
"Run a brief Routine to find the best threshold for the
|
|
60
|
+
"Run a brief Routine to find the best threshold for the light sensor at experiment start?"
|
|
84
61
|
)
|
|
85
62
|
)
|
|
86
63
|
self.params['threshold'] = Param(
|
|
87
64
|
threshold, valType="code", inputType="single", categ="Basic",
|
|
88
65
|
label=_translate("Threshold"),
|
|
89
66
|
hint=_translate(
|
|
90
|
-
"Light threshold at which the
|
|
91
|
-
"
|
|
67
|
+
"Light threshold at which the light sensor should register a positive, units go from 0 (least sensitive) to "
|
|
68
|
+
"1 (most sensitive)."
|
|
92
69
|
)
|
|
93
70
|
)
|
|
94
71
|
self.depends.append({
|
|
@@ -98,40 +75,40 @@ class PhotodiodeValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
|
98
75
|
"true": "hide", # should...
|
|
99
76
|
"false": "show", # otherwise...
|
|
100
77
|
})
|
|
101
|
-
self.params['
|
|
102
|
-
|
|
103
|
-
label=_translate("Find
|
|
78
|
+
self.params['findSensor'] = Param(
|
|
79
|
+
findSensor, valType="code", inputType="bool", categ="Basic",
|
|
80
|
+
label=_translate("Find sensor?"),
|
|
104
81
|
hint=_translate(
|
|
105
|
-
"Run a brief Routine to find the size and position of the
|
|
82
|
+
"Run a brief Routine to find the size and position of the light sensor at experiment start?"
|
|
106
83
|
)
|
|
107
84
|
)
|
|
108
|
-
self.params['
|
|
109
|
-
|
|
85
|
+
self.params['sensorPos'] = Param(
|
|
86
|
+
sensorPos, valType="list", inputType="single", categ="Basic",
|
|
110
87
|
updates="constant", allowedUpdates=['constant', 'set every repeat', 'set every frame'],
|
|
111
88
|
label=_translate("Position [x,y]"),
|
|
112
89
|
hint=_translate(
|
|
113
|
-
"Position of the
|
|
90
|
+
"Position of the light sensor on the window."
|
|
114
91
|
)
|
|
115
92
|
)
|
|
116
|
-
self.params['
|
|
117
|
-
|
|
93
|
+
self.params['sensorSize'] = Param(
|
|
94
|
+
sensorSize, valType="list", inputType="single", categ="Basic",
|
|
118
95
|
updates="constant", allowedUpdates=['constant', 'set every repeat', 'set every frame'],
|
|
119
96
|
label=_translate("Size [x,y]"),
|
|
120
97
|
hint=_translate(
|
|
121
|
-
"Size of the area covered by the
|
|
98
|
+
"Size of the area covered by the light sensor on the window."
|
|
122
99
|
)
|
|
123
100
|
)
|
|
124
|
-
self.params['
|
|
125
|
-
|
|
101
|
+
self.params['sensorUnits'] = Param(
|
|
102
|
+
sensorUnits, valType="str", inputType="choice", categ="Basic",
|
|
126
103
|
allowedVals=['from exp settings', 'deg', 'cm', 'pix', 'norm', 'height', 'degFlatPos', 'degFlat'],
|
|
127
104
|
label=_translate("Spatial units"),
|
|
128
105
|
hint=_translate(
|
|
129
|
-
"Spatial units in which the
|
|
106
|
+
"Spatial units in which the light sensor size and position are specified."
|
|
130
107
|
)
|
|
131
108
|
)
|
|
132
|
-
for param in ("
|
|
109
|
+
for param in ("sensorPos", "sensorSize", "sensorUnits"):
|
|
133
110
|
self.depends.append({
|
|
134
|
-
"dependsOn": "
|
|
111
|
+
"dependsOn": "findSensor", # if...
|
|
135
112
|
"condition": "==True", # is...
|
|
136
113
|
"param": param, # then...
|
|
137
114
|
"true": "hide", # should...
|
|
@@ -159,31 +136,22 @@ class PhotodiodeValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
|
159
136
|
deviceBackend, valType="code", inputType="choice", categ="Device",
|
|
160
137
|
allowedVals=self.getBackendKeys,
|
|
161
138
|
allowedLabels=self.getBackendLabels,
|
|
162
|
-
label=_translate("
|
|
139
|
+
label=_translate("Light sensor type"),
|
|
163
140
|
hint=_translate(
|
|
164
|
-
"Type of
|
|
141
|
+
"Type of light sensor to use."
|
|
165
142
|
),
|
|
166
143
|
direct=False
|
|
167
144
|
)
|
|
168
145
|
self.params['channel'] = Param(
|
|
169
146
|
channel, valType="code", inputType="single", categ="Device",
|
|
170
|
-
label=_translate("
|
|
147
|
+
label=_translate("Light sensor channel"),
|
|
171
148
|
hint=_translate(
|
|
172
|
-
"If relevant, a channel number attached to the
|
|
173
|
-
"from other
|
|
149
|
+
"If relevant, a channel number attached to the light sensor, to distinguish it "
|
|
150
|
+
"from other light sensors on the same port. Leave blank to use the first light sensor "
|
|
174
151
|
"which can detect the Window."
|
|
175
152
|
)
|
|
176
153
|
)
|
|
177
154
|
|
|
178
|
-
# --- Data ---
|
|
179
|
-
self.params['saveValid'] = Param(
|
|
180
|
-
saveValid, valType="code", inputType="bool", categ="Data",
|
|
181
|
-
label=_translate('Save validation results'),
|
|
182
|
-
hint=_translate(
|
|
183
|
-
"Save validation results after validating on/offset times for stimuli"
|
|
184
|
-
)
|
|
185
|
-
)
|
|
186
|
-
|
|
187
155
|
self.loadBackends()
|
|
188
156
|
|
|
189
157
|
def writeDeviceCode(self, buff):
|
|
@@ -207,9 +175,8 @@ class PhotodiodeValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
|
207
175
|
# find threshold if indicated
|
|
208
176
|
if self.params['findThreshold']:
|
|
209
177
|
code = (
|
|
210
|
-
"# find threshold for
|
|
211
|
-
"
|
|
212
|
-
" %(deviceLabelCode)s.findThreshold(win, channel=%(channel)s)\n"
|
|
178
|
+
"# find threshold for light sensor\n"
|
|
179
|
+
"%(deviceLabelCode)s.findThreshold(win, channel=%(channel)s)\n"
|
|
213
180
|
)
|
|
214
181
|
else:
|
|
215
182
|
code = (
|
|
@@ -217,54 +184,51 @@ class PhotodiodeValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
|
217
184
|
)
|
|
218
185
|
buff.writeOnceIndentedLines(code % inits)
|
|
219
186
|
# find pos if indicated
|
|
220
|
-
if self.params['
|
|
187
|
+
if self.params['findSensor']:
|
|
221
188
|
code = (
|
|
222
|
-
"# find position and size of
|
|
223
|
-
"
|
|
224
|
-
" %(deviceLabelCode)s.findPhotodiode(win, channel=%(channel)s)\n"
|
|
189
|
+
"# find position and size of the light sensor\n"
|
|
190
|
+
"%(deviceLabelCode)s.findSensor(win, channel=%(channel)s)\n"
|
|
225
191
|
)
|
|
226
192
|
buff.writeOnceIndentedLines(code % inits)
|
|
227
193
|
|
|
228
194
|
def writeMainCode(self, buff):
|
|
229
195
|
inits = getInitVals(self.params)
|
|
230
|
-
# get
|
|
196
|
+
# get Sensor
|
|
231
197
|
code = (
|
|
232
|
-
"#
|
|
233
|
-
"%(name)
|
|
198
|
+
"# Sensor object for %(name)s\n"
|
|
199
|
+
"%(name)sSensor = deviceManager.getDevice(%(deviceLabel)s)\n"
|
|
234
200
|
)
|
|
235
201
|
buff.writeIndentedLines(code % inits)
|
|
236
202
|
|
|
237
203
|
if self.params['threshold'] and not self.params['findThreshold']:
|
|
238
204
|
code = (
|
|
239
|
-
"%(name)
|
|
205
|
+
"%(name)sSensor.setThreshold(%(threshold)s, channel=%(channel)s)\n"
|
|
240
206
|
)
|
|
241
207
|
buff.writeIndentedLines(code % inits)
|
|
242
|
-
# find/set
|
|
243
|
-
if not self.params['
|
|
208
|
+
# find/set Sensor position
|
|
209
|
+
if not self.params['findSensor']:
|
|
244
210
|
code = ""
|
|
245
211
|
# set units (unless None)
|
|
246
|
-
if self.params['
|
|
212
|
+
if self.params['sensorUnits']:
|
|
247
213
|
code += (
|
|
248
|
-
"%(name)
|
|
214
|
+
"%(name)sSensor.units = %(sensorUnits)s\n"
|
|
249
215
|
)
|
|
250
216
|
# set pos (unless None)
|
|
251
|
-
if self.params['
|
|
217
|
+
if self.params['sensorPos']:
|
|
252
218
|
code += (
|
|
253
|
-
"%(name)
|
|
219
|
+
"%(name)sSensor.pos = %(sensorPos)s\n"
|
|
254
220
|
)
|
|
255
221
|
# set size (unless None)
|
|
256
|
-
if self.params['
|
|
222
|
+
if self.params['sensorSize']:
|
|
257
223
|
code += (
|
|
258
|
-
"%(name)
|
|
224
|
+
"%(name)sSensor.size = %(sensorSize)s\n"
|
|
259
225
|
)
|
|
260
226
|
buff.writeIndentedLines(code % inits)
|
|
261
227
|
# create validator object
|
|
262
228
|
code = (
|
|
263
229
|
"# validator object for %(name)s\n"
|
|
264
|
-
"%(name)s =
|
|
265
|
-
" win, %(name)
|
|
266
|
-
" variability=%(variability)s,\n"
|
|
267
|
-
" report=%(report)s,\n"
|
|
230
|
+
"%(name)s = validation.VisualValidator(\n"
|
|
231
|
+
" win, %(name)sSensor, %(channel)s,\n"
|
|
268
232
|
")\n"
|
|
269
233
|
)
|
|
270
234
|
buff.writeIndentedLines(code % inits)
|
|
@@ -297,7 +261,7 @@ class PhotodiodeValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
|
297
261
|
|
|
298
262
|
# choose a clock to sync to according to component's params
|
|
299
263
|
if "syncScreenRefresh" in stim.params and stim.params['syncScreenRefresh']:
|
|
300
|
-
clockStr = ""
|
|
264
|
+
clockStr = "clock=globalClock"
|
|
301
265
|
else:
|
|
302
266
|
clockStr = "clock=routineTimer"
|
|
303
267
|
# sync component start/stop timers with validator clocks
|
|
@@ -328,12 +292,18 @@ class PhotodiodeValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
|
328
292
|
"""
|
|
329
293
|
# get starting indent level
|
|
330
294
|
startIndent = buff.indentLevel
|
|
331
|
-
|
|
295
|
+
# choose attributes based on sync status
|
|
296
|
+
if "syncScreenRefresh" in stim.params and stim.params['syncScreenRefresh']:
|
|
297
|
+
startAttr = "tStartRefresh"
|
|
298
|
+
stopAttr = "tStopRefresh"
|
|
299
|
+
else:
|
|
300
|
+
startAttr = "tStart"
|
|
301
|
+
stopAttr = "tStop"
|
|
332
302
|
# validate start time
|
|
333
303
|
code = (
|
|
334
304
|
"# validate {name} start time\n"
|
|
335
305
|
"if {name}.status == STARTED and %(name)s.status == STARTED:\n"
|
|
336
|
-
" %(name)s.tStart, %(name)s.
|
|
306
|
+
" %(name)s.tStart, %(name)s.tStartDelay = %(name)s.validate(state=True, t={name}.{startAttr})\n"
|
|
337
307
|
" if %(name)s.tStart is not None:\n"
|
|
338
308
|
" %(name)s.status = FINISHED\n"
|
|
339
309
|
)
|
|
@@ -341,19 +311,15 @@ class PhotodiodeValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
|
341
311
|
# save validated start time if stim requested
|
|
342
312
|
code += (
|
|
343
313
|
" thisExp.addData('{name}.%(name)s.started', %(name)s.tStart)\n"
|
|
314
|
+
" thisExp.addData('%(name)s.startDelay', %(name)s.tStartDelay)\n"
|
|
344
315
|
)
|
|
345
|
-
|
|
346
|
-
# save validation result if params requested
|
|
347
|
-
code += (
|
|
348
|
-
" thisExp.addData('{name}.started.valid', %(name)s.tStartValid)\n"
|
|
349
|
-
)
|
|
350
|
-
buff.writeIndentedLines(code.format(**stim.params) % self.params)
|
|
316
|
+
buff.writeIndentedLines(code.format(startAttr=startAttr, **stim.params) % self.params)
|
|
351
317
|
|
|
352
318
|
# validate stop time
|
|
353
319
|
code = (
|
|
354
320
|
"# validate {name} stop time\n"
|
|
355
321
|
"if {name}.status == FINISHED and %(name)s.status == STARTED:\n"
|
|
356
|
-
" %(name)s.tStop, %(name)s.
|
|
322
|
+
" %(name)s.tStop, %(name)s.tStopDelay = %(name)s.validate(state=False, t={name}.{stopAttr})\n"
|
|
357
323
|
" if %(name)s.tStop is not None:\n"
|
|
358
324
|
" %(name)s.status = FINISHED\n"
|
|
359
325
|
)
|
|
@@ -361,13 +327,9 @@ class PhotodiodeValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
|
361
327
|
# save validated start time if stim requested
|
|
362
328
|
code += (
|
|
363
329
|
" thisExp.addData('{name}.%(name)s.stopped', %(name)s.tStop)\n"
|
|
330
|
+
" thisExp.addData('{name}.%(name)s.stopDelay', %(name)s.tStopDelay)\n"
|
|
364
331
|
)
|
|
365
|
-
|
|
366
|
-
# save validation result if params requested
|
|
367
|
-
code += (
|
|
368
|
-
" thisExp.addData('{name}.stopped.valid', %(name)s.tStopValid)\n"
|
|
369
|
-
)
|
|
370
|
-
buff.writeIndentedLines(code.format(**stim.params) % self.params)
|
|
332
|
+
buff.writeIndentedLines(code.format(stopAttr=stopAttr, **stim.params) % self.params)
|
|
371
333
|
|
|
372
334
|
# return change in indent level
|
|
373
335
|
return buff.indentLevel - startIndent
|
|
@@ -375,6 +337,7 @@ class PhotodiodeValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
|
375
337
|
def findConnectedStimuli(self):
|
|
376
338
|
# list of linked components
|
|
377
339
|
stims = []
|
|
340
|
+
routines = []
|
|
378
341
|
# inspect each Routine
|
|
379
342
|
for emt in self.exp.flow:
|
|
380
343
|
# skip non-standard Routines
|
|
@@ -388,22 +351,28 @@ class PhotodiodeValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
|
388
351
|
if compValidator == self:
|
|
389
352
|
# if found, add the comp to the list
|
|
390
353
|
stims.append(comp)
|
|
354
|
+
# add to list of Routines containing comps
|
|
355
|
+
if emt not in routines:
|
|
356
|
+
routines.append(emt)
|
|
357
|
+
# if any rt has two validated comps, warn
|
|
358
|
+
if len(routines) < len(stims):
|
|
359
|
+
alert(3610, obj=self, strFields={'validator': self.name})
|
|
391
360
|
|
|
392
361
|
return stims
|
|
393
362
|
|
|
394
363
|
|
|
395
|
-
class
|
|
364
|
+
class ScreenBufferVisualValidatorBackend(DeviceBackend):
|
|
396
365
|
"""
|
|
397
|
-
Adds a basic screen buffer emulation backend for
|
|
398
|
-
example for implementing other
|
|
366
|
+
Adds a basic screen buffer emulation backend for VisualValidator, as well as acting as an
|
|
367
|
+
example for implementing other light sensor device backends.
|
|
399
368
|
"""
|
|
400
369
|
|
|
401
370
|
key = "screenbuffer"
|
|
402
371
|
label = _translate("Screen Buffer (Debug)")
|
|
403
|
-
component =
|
|
404
|
-
deviceClasses = ["psychopy.hardware.
|
|
372
|
+
component = VisualValidatorRoutine
|
|
373
|
+
deviceClasses = ["psychopy.hardware.lightsensor.ScreenBufferSampler"]
|
|
405
374
|
|
|
406
|
-
def getParams(self:
|
|
375
|
+
def getParams(self: VisualValidatorRoutine):
|
|
407
376
|
# define order
|
|
408
377
|
order = [
|
|
409
378
|
]
|
|
@@ -416,13 +385,13 @@ class ScreenBufferPhotodiodeValidatorBackend(DeviceBackend):
|
|
|
416
385
|
# no requirements needed - so just return
|
|
417
386
|
return
|
|
418
387
|
|
|
419
|
-
def writeDeviceCode(self:
|
|
388
|
+
def writeDeviceCode(self: VisualValidatorRoutine, buff):
|
|
420
389
|
# get inits
|
|
421
390
|
inits = getInitVals(self.params)
|
|
422
391
|
# make ButtonGroup object
|
|
423
392
|
code = (
|
|
424
393
|
"deviceManager.addDevice(\n"
|
|
425
|
-
" deviceClass='psychopy.hardware.
|
|
394
|
+
" deviceClass='psychopy.hardware.lightsensor.ScreenBufferSampler',\n"
|
|
426
395
|
" deviceName=%(deviceLabel)s,\n"
|
|
427
396
|
" win=win,\n"
|
|
428
397
|
")\n"
|
|
Binary file
|
|
Binary file
|
psychopy/experiment/utils.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
# Part of the PsychoPy library
|
|
5
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
5
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
6
6
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
7
7
|
|
|
8
8
|
"""Utility functions to support Experiment classes
|
psychopy/gui/__init__.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
# Part of the PsychoPy library
|
|
5
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
5
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
6
6
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
7
7
|
|
|
8
8
|
"""
|