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
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from psychopy.experiment.components import BaseComponent, BaseDeviceComponent, Param, getInitVals
|
|
3
|
+
from psychopy.experiment.plugins import PluginDevicesMixin, DeviceBackend
|
|
4
|
+
from psychopy.localization import _translate
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SoundSensorComponent(BaseDeviceComponent, PluginDevicesMixin):
|
|
8
|
+
"""
|
|
9
|
+
Component for getting button presses from a button box device.
|
|
10
|
+
"""
|
|
11
|
+
categories = ['Responses'] # which section(s) in the components panel
|
|
12
|
+
targets = ['PsychoPy']
|
|
13
|
+
iconFile = Path(__file__).parent / 'soundsensor.png'
|
|
14
|
+
tooltip = _translate('Voice Key: Get input from a microphone as simple true/false values')
|
|
15
|
+
beta = True
|
|
16
|
+
|
|
17
|
+
def __init__(
|
|
18
|
+
self, exp, parentName,
|
|
19
|
+
# basic
|
|
20
|
+
name='soundSensor',
|
|
21
|
+
startType='time (s)', startVal=0.0,
|
|
22
|
+
stopType='duration (s)', stopVal=1.0,
|
|
23
|
+
startEstim='', durationEstim='',
|
|
24
|
+
forceEndRoutine=True,
|
|
25
|
+
# device
|
|
26
|
+
deviceLabel="",
|
|
27
|
+
deviceBackend="microphone",
|
|
28
|
+
# data
|
|
29
|
+
registerOn=True,
|
|
30
|
+
store='first',
|
|
31
|
+
storeCorrect=False,
|
|
32
|
+
correctAns="",
|
|
33
|
+
# testing
|
|
34
|
+
disabled=False,
|
|
35
|
+
):
|
|
36
|
+
# initialise base class
|
|
37
|
+
BaseDeviceComponent.__init__(
|
|
38
|
+
self, exp, parentName,
|
|
39
|
+
name=name,
|
|
40
|
+
startType=startType, startVal=startVal,
|
|
41
|
+
stopType=stopType, stopVal=stopVal,
|
|
42
|
+
startEstim=startEstim, durationEstim=durationEstim,
|
|
43
|
+
deviceLabel=deviceLabel,
|
|
44
|
+
disabled=disabled
|
|
45
|
+
)
|
|
46
|
+
self.type = "SoundSensor"
|
|
47
|
+
|
|
48
|
+
self.exp.requireImport(
|
|
49
|
+
importName="SoundSensor",
|
|
50
|
+
importFrom="psychopy.hardware.soundsensor"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# --- Basic params ---
|
|
54
|
+
self.order += [
|
|
55
|
+
"forceEndRoutine"
|
|
56
|
+
]
|
|
57
|
+
self.params['forceEndRoutine'] = Param(
|
|
58
|
+
forceEndRoutine, valType='bool', inputType="bool", categ='Basic',
|
|
59
|
+
hint=_translate(
|
|
60
|
+
"Should a response force the end of the Routine (e.g end the trial)?"
|
|
61
|
+
),
|
|
62
|
+
label=_translate("Force end of Routine"))
|
|
63
|
+
|
|
64
|
+
# --- Data params ---
|
|
65
|
+
self.order += [
|
|
66
|
+
"registerOn",
|
|
67
|
+
"store",
|
|
68
|
+
"allowedButtons",
|
|
69
|
+
"storeCorrect",
|
|
70
|
+
"correctAns",
|
|
71
|
+
]
|
|
72
|
+
self.params['registerOn'] = Param(
|
|
73
|
+
registerOn, valType='code', inputType='choice', categ='Data',
|
|
74
|
+
allowedVals=[True, False],
|
|
75
|
+
allowedLabels=[_translate("Press"), _translate("Release")],
|
|
76
|
+
hint=_translate(
|
|
77
|
+
"When should the response be registered? When the sound starts, or when it stops?"
|
|
78
|
+
),
|
|
79
|
+
label=_translate("Register button press on...")
|
|
80
|
+
)
|
|
81
|
+
self.params['store'] = Param(
|
|
82
|
+
store, valType='str', inputType="choice", categ='Data',
|
|
83
|
+
allowedVals=['last', 'first', 'all', 'nothing'],
|
|
84
|
+
allowedLabels=[_translate("Last response"), _translate("First response"), _translate(
|
|
85
|
+
"All responses"), _translate("Nothing")],
|
|
86
|
+
updates='constant', direct=False,
|
|
87
|
+
hint=_translate(
|
|
88
|
+
"Choose which (if any) responses to store at the end of a trial"
|
|
89
|
+
),
|
|
90
|
+
label=_translate("Store"))
|
|
91
|
+
self.params['storeCorrect'] = Param(
|
|
92
|
+
storeCorrect, valType='bool', inputType="bool", categ='Data',
|
|
93
|
+
updates='constant',
|
|
94
|
+
hint=_translate(
|
|
95
|
+
"Do you want to save the response as correct/incorrect?"
|
|
96
|
+
),
|
|
97
|
+
label=_translate("Store correct"))
|
|
98
|
+
self.depends.append(
|
|
99
|
+
{
|
|
100
|
+
"dependsOn": "storeCorrect", # if...
|
|
101
|
+
"condition": f"== True", # meets...
|
|
102
|
+
"param": "correctAns", # then...
|
|
103
|
+
"true": "show", # should...
|
|
104
|
+
"false": "hide", # otherwise...
|
|
105
|
+
}
|
|
106
|
+
)
|
|
107
|
+
self.params['correctAns'] = Param(
|
|
108
|
+
correctAns, valType='code', inputType="single", categ='Data',
|
|
109
|
+
hint=_translate(
|
|
110
|
+
"What is the 'correct' response (True/False)? Might be helpful to add a correctAns column and use "
|
|
111
|
+
"$correctAns to compare to the response. "
|
|
112
|
+
),
|
|
113
|
+
label=_translate("Correct answer"), direct=False)
|
|
114
|
+
|
|
115
|
+
# --- Device params ---
|
|
116
|
+
self.order += [
|
|
117
|
+
"deviceBackend",
|
|
118
|
+
]
|
|
119
|
+
|
|
120
|
+
self.params['deviceBackend'] = Param(
|
|
121
|
+
deviceBackend, valType="str", inputType="choice", categ="Device",
|
|
122
|
+
allowedVals=self.getBackendKeys,
|
|
123
|
+
allowedLabels=self.getBackendLabels,
|
|
124
|
+
label=_translate("Device backend"),
|
|
125
|
+
hint=_translate(
|
|
126
|
+
"What kind of sound sensor is it? What package/plugin should be used to talk to it?"
|
|
127
|
+
),
|
|
128
|
+
direct=False
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# add params for any backends
|
|
132
|
+
self.loadBackends()
|
|
133
|
+
|
|
134
|
+
def writeInitCode(self, buff):
|
|
135
|
+
inits = getInitVals(self.params)
|
|
136
|
+
# code to create object
|
|
137
|
+
code = (
|
|
138
|
+
"%(name)s = SoundSensor(\n"
|
|
139
|
+
" device=%(deviceLabel)s\n"
|
|
140
|
+
")\n"
|
|
141
|
+
)
|
|
142
|
+
buff.writeIndentedLines(code % inits)
|
|
143
|
+
|
|
144
|
+
def writeRoutineStartCode(self, buff):
|
|
145
|
+
# choose a clock to sync to according to component's params
|
|
146
|
+
if "syncScreenRefresh" in self.params and self.params['syncScreenRefresh']:
|
|
147
|
+
clockStr = ""
|
|
148
|
+
else:
|
|
149
|
+
clockStr = "clock=routineTimer"
|
|
150
|
+
# sync component start/stop timers with validator clocks
|
|
151
|
+
code = (
|
|
152
|
+
f"# synchronise device clock for %(name)s with Routine timer\n"
|
|
153
|
+
f"%(name)s.resetTimer({clockStr})\n"
|
|
154
|
+
)
|
|
155
|
+
buff.writeIndentedLines(code % self.params)
|
|
156
|
+
# clear keys
|
|
157
|
+
code = (
|
|
158
|
+
"# clear %(name)s button presses\n"
|
|
159
|
+
"%(name)s.times = []\n"
|
|
160
|
+
"%(name)s.corr = []\n"
|
|
161
|
+
)
|
|
162
|
+
buff.writeIndentedLines(code % self.params)
|
|
163
|
+
|
|
164
|
+
def writeFrameCode(self, buff):
|
|
165
|
+
params = self.params
|
|
166
|
+
code = (
|
|
167
|
+
"\n"
|
|
168
|
+
"# *%(name)s* updates\n"
|
|
169
|
+
)
|
|
170
|
+
buff.writeIndentedLines(code % params)
|
|
171
|
+
# writes an if statement to determine whether to draw etc
|
|
172
|
+
indented = self.writeStartTestCode(buff)
|
|
173
|
+
if indented:
|
|
174
|
+
# dispatch and clear messages
|
|
175
|
+
code = (
|
|
176
|
+
"# clear any messages from before starting\n"
|
|
177
|
+
"%(name)s.responses = []\n"
|
|
178
|
+
"%(name)s.clearResponses()\n"
|
|
179
|
+
)
|
|
180
|
+
buff.writeIndentedLines(code % params)
|
|
181
|
+
# to get out of the if statement
|
|
182
|
+
buff.setIndentLevel(-indented, relative=True)
|
|
183
|
+
|
|
184
|
+
# test for started (will update parameters each frame as needed)
|
|
185
|
+
indented = self.writeActiveTestCode(buff)
|
|
186
|
+
if indented:
|
|
187
|
+
# write code to get messages
|
|
188
|
+
code = (
|
|
189
|
+
"# ask for messages from %(name)s device this frame\n"
|
|
190
|
+
"for _thisResp in %(name)s.getResponses(\n"
|
|
191
|
+
" state=%(registerOn)s, clear=True\n"
|
|
192
|
+
"):\n"
|
|
193
|
+
)
|
|
194
|
+
if self.params['store'] == "all":
|
|
195
|
+
# if storing all, append
|
|
196
|
+
code += (
|
|
197
|
+
" %(name)s.times.append(_thisResp.t)\n"
|
|
198
|
+
)
|
|
199
|
+
# include code to get correct
|
|
200
|
+
if self.params['storeCorrect']:
|
|
201
|
+
code += (
|
|
202
|
+
" if bool(_thisResp.value) is bool(%(correctAns)s):\n"
|
|
203
|
+
" %(name)s.corr.append(1)\n"
|
|
204
|
+
" else:\n"
|
|
205
|
+
" %(name)s.corr.append(0)\n"
|
|
206
|
+
)
|
|
207
|
+
elif self.params['store'] == "last":
|
|
208
|
+
# if storing last, replace
|
|
209
|
+
code += (
|
|
210
|
+
" %(name)s.times = _thisResp.t\n"
|
|
211
|
+
)
|
|
212
|
+
# include code to get correct
|
|
213
|
+
if self.params['storeCorrect']:
|
|
214
|
+
code += (
|
|
215
|
+
" if bool(_thisResp.value) is bool(%(correctAns)s):\n"
|
|
216
|
+
" %(name)s.corr = 1\n"
|
|
217
|
+
" else:\n"
|
|
218
|
+
" %(name)s.corr = 0\n"
|
|
219
|
+
)
|
|
220
|
+
elif self.params['store'] == "first":
|
|
221
|
+
# if storing first, replace but only if empty
|
|
222
|
+
code += (
|
|
223
|
+
" if not %(name)s.buttons:\n"
|
|
224
|
+
" %(name)s.times = _thisResp.t\n"
|
|
225
|
+
)
|
|
226
|
+
# include code to get correct
|
|
227
|
+
if self.params['storeCorrect']:
|
|
228
|
+
code += (
|
|
229
|
+
" if bool(_thisResp.value) is bool(%(correctAns)s):\n"
|
|
230
|
+
" %(name)s.corr = 1\n"
|
|
231
|
+
" else:\n"
|
|
232
|
+
" %(name)s.corr = 0\n"
|
|
233
|
+
)
|
|
234
|
+
else:
|
|
235
|
+
code = "pass\n"
|
|
236
|
+
|
|
237
|
+
buff.writeIndentedLines(code % params)
|
|
238
|
+
# code to end Routine
|
|
239
|
+
if self.params['forceEndRoutine']:
|
|
240
|
+
code = (
|
|
241
|
+
"# end Routine if %(name)s got response\n"
|
|
242
|
+
"if %(name)s.times:\n"
|
|
243
|
+
" continueRoutine = False\n"
|
|
244
|
+
)
|
|
245
|
+
buff.writeIndentedLines(code % params)
|
|
246
|
+
|
|
247
|
+
# to get out of the if statement
|
|
248
|
+
buff.setIndentLevel(-indented, relative=True)
|
|
249
|
+
|
|
250
|
+
# test for stop (only if there was some setting for duration or stop)
|
|
251
|
+
indented = self.writeStopTestCode(buff)
|
|
252
|
+
if indented:
|
|
253
|
+
# to get out of the if statement
|
|
254
|
+
buff.setIndentLevel(-indented, relative=True)
|
|
255
|
+
|
|
256
|
+
def writeRoutineEndCode(self, buff):
|
|
257
|
+
BaseComponent.writeRoutineEndCode(self, buff)
|
|
258
|
+
params = self.params
|
|
259
|
+
|
|
260
|
+
# write code to save responses
|
|
261
|
+
code = (
|
|
262
|
+
"# store data from %(name)s\n"
|
|
263
|
+
"thisExp.addData('%(name)s.times', %(name)s.times)\n"
|
|
264
|
+
"thisExp.addData('%(name)s.corr', %(name)s.corr)\n"
|
|
265
|
+
)
|
|
266
|
+
buff.writeIndentedLines(code % params)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
class MicrophoneSoundSensorBackend(DeviceBackend):
|
|
270
|
+
"""
|
|
271
|
+
Adds a basic microphone emulation backend for SoundSensorComponent, as well as acting as an example
|
|
272
|
+
for implementing other SoundSensorBackends.
|
|
273
|
+
"""
|
|
274
|
+
|
|
275
|
+
key = "microphone"
|
|
276
|
+
label = _translate("Microphone emulator")
|
|
277
|
+
component = SoundSensorComponent
|
|
278
|
+
deviceClasses = ['psychopy.hardware.soundsensor.MicrophoneSoundSensorEmulator']
|
|
279
|
+
|
|
280
|
+
def getParams(self: SoundSensorComponent):
|
|
281
|
+
# define order
|
|
282
|
+
order = [
|
|
283
|
+
"meMicrophone",
|
|
284
|
+
"meThreshold",
|
|
285
|
+
"meRange",
|
|
286
|
+
"meSamplingWindow",
|
|
287
|
+
]
|
|
288
|
+
# define params
|
|
289
|
+
params = {}
|
|
290
|
+
def getDeviceIndices():
|
|
291
|
+
from psychopy.hardware.microphone import MicrophoneDevice
|
|
292
|
+
profiles = MicrophoneDevice.getAvailableDevices()
|
|
293
|
+
|
|
294
|
+
return [None] + [profile['index'] for profile in profiles]
|
|
295
|
+
|
|
296
|
+
def getDeviceNames():
|
|
297
|
+
from psychopy.hardware.microphone import MicrophoneDevice
|
|
298
|
+
profiles = MicrophoneDevice.getAvailableDevices()
|
|
299
|
+
|
|
300
|
+
return ["default"] + [profile['deviceName'] for profile in profiles]
|
|
301
|
+
|
|
302
|
+
params['meMicrophone'] = Param(
|
|
303
|
+
None, valType="str", inputType="choice", categ="Device",
|
|
304
|
+
updates="constant", allowedUpdates=None,
|
|
305
|
+
allowedVals=getDeviceIndices,
|
|
306
|
+
allowedLabels=getDeviceNames,
|
|
307
|
+
label=_translate("Microphone"),
|
|
308
|
+
hint=_translate(
|
|
309
|
+
"What microphone device to take volume readings from?"
|
|
310
|
+
)
|
|
311
|
+
)
|
|
312
|
+
params['meThreshold'] = Param(
|
|
313
|
+
0.5, valType="code", inputType="single", categ="Device",
|
|
314
|
+
updates="constant", allowedUpdates=None,
|
|
315
|
+
label=_translate("Threshold (0-1)"),
|
|
316
|
+
hint=_translate(
|
|
317
|
+
"Threshold volume (0 for min value in dB range, 1 for max value) above which to "
|
|
318
|
+
"register a sound sensor response"
|
|
319
|
+
)
|
|
320
|
+
)
|
|
321
|
+
params['meRange'] = Param(
|
|
322
|
+
(0, 1), valType="list", inputType="single", categ="Device",
|
|
323
|
+
updates="constant", allowedUpdates=None,
|
|
324
|
+
label=_translate("Decibel range"),
|
|
325
|
+
hint=_translate(
|
|
326
|
+
"What kind of values (dB) would you expect to receive from this device? In other "
|
|
327
|
+
"words, how many dB does a threshold of 0 and of 255 correspond to?"
|
|
328
|
+
)
|
|
329
|
+
)
|
|
330
|
+
params['meSamplingWindow'] = Param(
|
|
331
|
+
0.03, valType="code", inputType="single", categ="Device",
|
|
332
|
+
updates="constant", allowedUpdates=None,
|
|
333
|
+
label=_translate("Sampling window (s)"),
|
|
334
|
+
hint=_translate(
|
|
335
|
+
"How many seconds to average volume readings across? Bigger windows are less "
|
|
336
|
+
"precise, but also less subject to random noise."
|
|
337
|
+
)
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
return params, order
|
|
341
|
+
|
|
342
|
+
def addRequirements(self: SoundSensorComponent):
|
|
343
|
+
self.exp.requireImport(
|
|
344
|
+
importName="microphone", importFrom="psychopy.hardware"
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
def writeDeviceCode(self: SoundSensorComponent, buff):
|
|
348
|
+
# get inits
|
|
349
|
+
inits = getInitVals(self.params)
|
|
350
|
+
# make ButtonGroup object
|
|
351
|
+
code = (
|
|
352
|
+
"deviceManager.addDevice(\n"
|
|
353
|
+
" deviceClass='psychopy.hardware.soundsensor.MicrophoneSoundSensorEmulator',\n"
|
|
354
|
+
" deviceName=%(deviceLabel)s,\n"
|
|
355
|
+
" device=%(meMicrophone)s,\n"
|
|
356
|
+
" threshold=%(meThreshold)s, \n"
|
|
357
|
+
" dbRange=%(meRange)s, \n"
|
|
358
|
+
" samplingWindow=%(meSamplingWindow)s, \n"
|
|
359
|
+
")\n"
|
|
360
|
+
)
|
|
361
|
+
buff.writeOnceIndentedLines(code % inits)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
"""
|
|
5
5
|
Part of the PsychoPy library
|
|
6
|
-
Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
6
|
+
Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
7
7
|
Distributed under the terms of the GNU General Public License (GPL).
|
|
8
8
|
"""
|
|
9
9
|
|
|
@@ -26,10 +26,18 @@ class StaticComponent(BaseComponent):
|
|
|
26
26
|
tooltip = _translate('Static: Static screen period (e.g. an ISI). '
|
|
27
27
|
'Useful for pre-loading stimuli.')
|
|
28
28
|
|
|
29
|
-
def __init__(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
def __init__(
|
|
30
|
+
self, exp, parentName,
|
|
31
|
+
# basic
|
|
32
|
+
name='ISI',
|
|
33
|
+
startType='time (s)', startVal=0.0,
|
|
34
|
+
stopType='duration (s)', stopVal=0.5,
|
|
35
|
+
startEstim='', durationEstim='',
|
|
36
|
+
# custom
|
|
37
|
+
code="",
|
|
38
|
+
# data
|
|
39
|
+
saveData=False
|
|
40
|
+
):
|
|
33
41
|
BaseComponent.__init__(
|
|
34
42
|
self, exp, parentName, name=name,
|
|
35
43
|
startType=startType, startVal=startVal,
|
|
@@ -39,11 +47,26 @@ class StaticComponent(BaseComponent):
|
|
|
39
47
|
self.updatesList = [] # a list of dicts {compParams, fieldName}
|
|
40
48
|
self.type = 'Static'
|
|
41
49
|
self.url = "https://www.psychopy.org/builder/components/static.html"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
50
|
+
# --- Custom params ---
|
|
51
|
+
self.order += [
|
|
52
|
+
"code",
|
|
53
|
+
"saveData",
|
|
54
|
+
]
|
|
55
|
+
self.params['code'] = Param(
|
|
56
|
+
code, valType='code', inputType="multi", categ='Custom',
|
|
57
|
+
label=_translate("Custom code"),
|
|
58
|
+
hint=_translate(
|
|
59
|
+
"Custom code to be run during the static period (after updates)"
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
self.params['saveData'] = Param(
|
|
63
|
+
saveData, valType="code", inputType="bool", categ="Custom",
|
|
64
|
+
label=_translate("Save data during"),
|
|
65
|
+
hint=_translate(
|
|
66
|
+
"While the frame loop is paused, should we take the opportunity to save data now? "
|
|
67
|
+
"This is only relevant locally, online data saving is either periodic or on close."
|
|
68
|
+
)
|
|
69
|
+
)
|
|
47
70
|
|
|
48
71
|
def addComponentUpdate(self, routine, compName, fieldName):
|
|
49
72
|
self.updatesList.append({'compName': compName,
|
|
@@ -157,7 +180,10 @@ class StaticComponent(BaseComponent):
|
|
|
157
180
|
buff.writeIndented("# *%s* period\n" % (self.params['name']))
|
|
158
181
|
needsUnindent = BaseComponent.writeStartTestCode(self, buff)
|
|
159
182
|
if needsUnindent:
|
|
160
|
-
if self.params['
|
|
183
|
+
if self.params['stopVal'] in ("", "-1", "None", None):
|
|
184
|
+
# if duration is infinite, set it to extremely long and warn the user
|
|
185
|
+
durationSecsStr = "FOREVER"
|
|
186
|
+
elif self.params['stopType'].val == 'time (s)':
|
|
161
187
|
durationSecsStr = "%(stopVal)s-t" % (self.params)
|
|
162
188
|
elif self.params['stopType'].val == 'duration (s)':
|
|
163
189
|
durationSecsStr = "%(stopVal)s" % (self.params)
|
|
@@ -169,9 +195,21 @@ class StaticComponent(BaseComponent):
|
|
|
169
195
|
msg = ("Couldn't deduce end point for startType=%(startType)s, "
|
|
170
196
|
"stopType=%(stopType)s")
|
|
171
197
|
raise Exception(msg % self.params)
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
198
|
+
# save data
|
|
199
|
+
if self.params['saveData']:
|
|
200
|
+
code = (
|
|
201
|
+
"# take the opportunity to save data file now (to be updated later)\n"
|
|
202
|
+
"_%(name)sLastFileNames = thisExp.save()\n"
|
|
203
|
+
"thisExp.queueNextCollision('overwrite', fileName=_%(name)sLastFileNames)\n"
|
|
204
|
+
)
|
|
205
|
+
buff.writeIndentedLines(code % self.params)
|
|
206
|
+
# start static
|
|
207
|
+
code = (
|
|
208
|
+
"# start the static period\n"
|
|
209
|
+
"%(name)s.start({})\n"
|
|
210
|
+
).format(durationSecsStr)
|
|
211
|
+
buff.writeIndentedLines(code % self.params)
|
|
212
|
+
|
|
175
213
|
return needsUnindent
|
|
176
214
|
|
|
177
215
|
def writeStopTestCode(self, buff):
|
|
@@ -182,28 +220,16 @@ class StaticComponent(BaseComponent):
|
|
|
182
220
|
buff.writeIndented(code % self.params)
|
|
183
221
|
buff.setIndentLevel(+1, relative=True) # entered an if statement
|
|
184
222
|
self.writeParamUpdates(buff)
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
elif self.params['stopType'].val == 'duration (frames)':
|
|
193
|
-
code = "%(name)s.tStop = %(name)s.tStart + %(stopVal)s*frameDur # record stop time\n"
|
|
194
|
-
elif self.params['stopType'].val == 'frame N':
|
|
195
|
-
code = "%(name)s.tStop = %(stopVal)s*frameDur # record stop time\n"
|
|
196
|
-
else:
|
|
197
|
-
msg = ("Couldn't deduce end point for startType=%(startType)s, "
|
|
198
|
-
"stopType=%(stopType)s")
|
|
199
|
-
raise Exception(msg % self.params)
|
|
200
|
-
# Store stop time
|
|
201
|
-
buff.writeIndented(code % self.params)
|
|
223
|
+
# finish
|
|
224
|
+
code = (
|
|
225
|
+
"# finish the static period and store its duration\n"
|
|
226
|
+
"%(name)s.complete()\n"
|
|
227
|
+
"%(name)s.tStop = %(name)s.tStart + %(name)s.getDuration()\n"
|
|
228
|
+
)
|
|
229
|
+
buff.writeIndentedLines(code % self.params)
|
|
202
230
|
# to get out of the if statement
|
|
203
231
|
buff.setIndentLevel(-1, relative=True)
|
|
204
232
|
|
|
205
|
-
# pass # the clock.StaticPeriod class handles its own stopping
|
|
206
|
-
|
|
207
233
|
def writeParamUpdates(self, buff, updateType=None, paramNames=None, target="PsychoPy"):
|
|
208
234
|
"""Write updates. Unlike most components, which us this method
|
|
209
235
|
to update themselves, the Static Component uses this to update
|
|
@@ -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
|
from pathlib import Path
|
|
@@ -54,7 +54,7 @@ class TextComponent(BaseVisualComponent):
|
|
|
54
54
|
canBePath=False,
|
|
55
55
|
label=_translate("Text"))
|
|
56
56
|
self.params['font'] = Param(
|
|
57
|
-
font, valType='str', inputType="
|
|
57
|
+
font, valType='str', inputType="font", allowedTypes=[], categ='Formatting',
|
|
58
58
|
updates='constant', allowedUpdates=_allow3[:], # copy the list
|
|
59
59
|
hint=_translate("The font name (e.g. Comic Sans)"),
|
|
60
60
|
label=_translate("Font"))
|
|
@@ -188,7 +188,3 @@ class TextComponent(BaseVisualComponent):
|
|
|
188
188
|
code = (" %sdepth: %.1f \n"
|
|
189
189
|
"});\n\n" % (flipStr, depth))
|
|
190
190
|
buff.writeIndentedLines(code)
|
|
191
|
-
|
|
192
|
-
def integrityCheck(self):
|
|
193
|
-
super().integrityCheck() # run parent class checks first
|
|
194
|
-
alerttools.testFont(self) # Test whether font is available locally
|
|
@@ -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
|
from pathlib import Path
|
|
@@ -19,7 +19,7 @@ class TextboxComponent(BaseVisualComponent):
|
|
|
19
19
|
version = "2020.2.0"
|
|
20
20
|
iconFile = Path(__file__).parent / 'textbox.png'
|
|
21
21
|
tooltip = _translate('Textbox: present text stimuli but cooler')
|
|
22
|
-
beta =
|
|
22
|
+
beta = False
|
|
23
23
|
|
|
24
24
|
def __init__(self, exp, parentName, name='textbox',
|
|
25
25
|
# effectively just a display-value
|
|
@@ -85,7 +85,7 @@ class TextboxComponent(BaseVisualComponent):
|
|
|
85
85
|
hint=_translate("Placeholder text to show when there is no text contents."),
|
|
86
86
|
label=_translate("Placeholder text"))
|
|
87
87
|
self.params['font'] = Param(
|
|
88
|
-
font, valType='str', inputType="
|
|
88
|
+
font, valType='str', inputType="font", allowedTypes=[], categ='Formatting',
|
|
89
89
|
updates='constant', allowedUpdates=_allow3[:], # copy the list
|
|
90
90
|
hint=_translate("The font name (e.g. Comic Sans)"),
|
|
91
91
|
label=_translate("Font"))
|
|
@@ -334,7 +334,3 @@ class TextboxComponent(BaseVisualComponent):
|
|
|
334
334
|
buff.writeIndentedLines(f"psychoJS.experiment.addData('{name}.text',{name}.text)\n")
|
|
335
335
|
# get parent to write code too (e.g. store onset/offset times)
|
|
336
336
|
super().writeRoutineEndCodeJS(buff)
|
|
337
|
-
|
|
338
|
-
def integrityCheck(self):
|
|
339
|
-
super().integrityCheck() # run parent class checks first
|
|
340
|
-
alerttools.testFont(self) # Test whether font is available locally
|
|
@@ -20,6 +20,8 @@ class UnknownComponent(BaseComponent):
|
|
|
20
20
|
tooltip = _translate('Unknown: A component that is not known by the current '
|
|
21
21
|
'installed version of PsychoPy\n(most likely from the '
|
|
22
22
|
'future)')
|
|
23
|
+
# hide from the Components panel
|
|
24
|
+
hidden = True
|
|
23
25
|
|
|
24
26
|
def __init__(self, exp, parentName, name='', compType="UnknownComponent"):
|
|
25
27
|
self.exp = exp # so we can access the experiment if necess
|
|
@@ -18,6 +18,8 @@ class UnknownPluginComponent(BaseComponent):
|
|
|
18
18
|
targets = ['PsychoPy']
|
|
19
19
|
iconFile = Path(__file__).parent / 'unknownPlugin.png'
|
|
20
20
|
tooltip = _translate('Unknown: A component which comes from a plugin which you do not have installed & activated.')
|
|
21
|
+
# hide from the Components panel
|
|
22
|
+
hidden = True
|
|
21
23
|
|
|
22
24
|
def __init__(self, exp, parentName, name='', compType="UnknownPluginComponent"):
|
|
23
25
|
self.exp = exp # so we can access the experiment if necess
|
psychopy/experiment/exports.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
|
"""Experiment classes:
|
psychopy/experiment/flow.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
|
"""Describes the Flow of an experiment
|
|
@@ -456,7 +456,7 @@ class Flow(list):
|
|
|
456
456
|
name = resource.split('/')[-1]
|
|
457
457
|
elif 'surveyId' in resource:
|
|
458
458
|
name = 'surveyId'
|
|
459
|
-
elif 'name' in resource
|
|
459
|
+
elif 'name' in resource:
|
|
460
460
|
name = resource['name']
|
|
461
461
|
elif 'rel' in resource:
|
|
462
462
|
name = resource['rel']
|
|
@@ -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
|
"""These are probably going to get used a lot so translate them once and reuse
|