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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Test PsychoPy sound.py using pygame backend; will fail if have already used pyo
|
|
2
2
|
"""
|
|
3
3
|
|
|
4
|
+
from pathlib import Path
|
|
4
5
|
from psychopy import prefs, core, plugins
|
|
5
6
|
prefs.hardware['audioLib'] = ['ptb', 'sounddevice']
|
|
6
7
|
|
|
@@ -8,6 +9,7 @@ import pytest
|
|
|
8
9
|
import shutil
|
|
9
10
|
from tempfile import mkdtemp
|
|
10
11
|
from psychopy import sound #, microphone
|
|
12
|
+
from psychopy.hardware import DeviceManager, speaker
|
|
11
13
|
|
|
12
14
|
import numpy
|
|
13
15
|
|
|
@@ -16,52 +18,121 @@ import numpy
|
|
|
16
18
|
from psychopy.tests.utils import TESTS_PATH, TESTS_DATA_PATH
|
|
17
19
|
|
|
18
20
|
@pytest.mark.needs_sound
|
|
19
|
-
class
|
|
20
|
-
@classmethod
|
|
21
|
+
class TestSounds:
|
|
21
22
|
def setup_class(self):
|
|
22
23
|
self.contextName='ptb'
|
|
23
24
|
self.tmp = mkdtemp(prefix='psychopy-tests-sound')
|
|
25
|
+
# create just one instance for each speaker
|
|
26
|
+
self.speakers = {}
|
|
27
|
+
for profile in DeviceManager.getAvailableDevices(
|
|
28
|
+
"psychopy.hardware.speaker.SpeakerDevice"
|
|
29
|
+
):
|
|
30
|
+
self.speakers[profile['index']] = speaker.SpeakerDevice(profile['index'])
|
|
31
|
+
# if there's no devices, skip everything
|
|
32
|
+
if not len(self.speakers):
|
|
33
|
+
pytest.skip()
|
|
24
34
|
|
|
25
|
-
@classmethod
|
|
26
35
|
def teardown_class(self):
|
|
36
|
+
for i, spk in self.speakers.items():
|
|
37
|
+
spk.close()
|
|
38
|
+
# delete temp dir
|
|
27
39
|
if hasattr(self, 'tmp'):
|
|
28
40
|
shutil.rmtree(self.tmp, ignore_errors=True)
|
|
29
41
|
|
|
30
|
-
def
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
def test_playback(self):
|
|
43
|
+
"""
|
|
44
|
+
Check that Sound can be initialised with a variety of values
|
|
45
|
+
"""
|
|
46
|
+
# check values which should work
|
|
47
|
+
cases = [
|
|
48
|
+
# default stim
|
|
49
|
+
"default.mp3",
|
|
50
|
+
"default.wav",
|
|
51
|
+
# extant file
|
|
52
|
+
Path(TESTS_DATA_PATH) / "Electronic_Chime-KevanGC-495939803.wav",
|
|
53
|
+
# notes
|
|
54
|
+
"A",
|
|
55
|
+
440,
|
|
56
|
+
'440',
|
|
57
|
+
[1,2,3,4],
|
|
58
|
+
numpy.array([1,2,3,4]),
|
|
59
|
+
]
|
|
60
|
+
# try on every speaker
|
|
61
|
+
for i, spk in self.speakers.items():
|
|
62
|
+
for case in cases:
|
|
63
|
+
snd = sound.Sound(
|
|
64
|
+
value=case,
|
|
65
|
+
secs=0.1,
|
|
66
|
+
speaker=spk,
|
|
67
|
+
)
|
|
68
|
+
snd.play()
|
|
69
|
+
snd.stop()
|
|
70
|
+
|
|
71
|
+
def test_error(self):
|
|
72
|
+
"""
|
|
73
|
+
Check that various invalid values raise the correct error
|
|
74
|
+
"""
|
|
75
|
+
# check values which should error
|
|
76
|
+
cases = [
|
|
77
|
+
{'val': "'this is not a file name'", 'secs': .1, 'err': ValueError},
|
|
78
|
+
{'val': "-1", 'secs': .1, 'err': ValueError},
|
|
79
|
+
]
|
|
80
|
+
# try on every speaker
|
|
81
|
+
for i, spk in self.speakers.items():
|
|
82
|
+
for case in cases:
|
|
83
|
+
with pytest.raises(case['err']):
|
|
84
|
+
snd = sound.Sound(
|
|
85
|
+
value=case['val'],
|
|
86
|
+
secs=0.1,
|
|
87
|
+
speaker=spk,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
def test_sample_rate_mismatch(self):
|
|
91
|
+
"""
|
|
92
|
+
Check that Sound can handle a mismatch of sample rates between a file and a speaker
|
|
93
|
+
"""
|
|
94
|
+
# specify some common sample rates
|
|
95
|
+
sampleRates = (
|
|
96
|
+
8000,
|
|
97
|
+
16000,
|
|
98
|
+
22050,
|
|
99
|
+
32000,
|
|
100
|
+
44100,
|
|
101
|
+
48000,
|
|
102
|
+
96000,
|
|
103
|
+
192000,
|
|
104
|
+
)
|
|
105
|
+
# iterate through speakers
|
|
106
|
+
for i, spk in self.speakers.items():
|
|
107
|
+
for sr in sampleRates:
|
|
108
|
+
# try to play sound on speaker
|
|
109
|
+
try:
|
|
110
|
+
snd = sound.Sound(
|
|
111
|
+
value=Path(TESTS_DATA_PATH) / "test_sounds" / f"default_{sr}.wav",
|
|
112
|
+
speaker=spk,
|
|
113
|
+
secs=-1,
|
|
114
|
+
)
|
|
115
|
+
snd.play()
|
|
116
|
+
except Exception as err:
|
|
117
|
+
# include sample rate of sound and speaker in error message
|
|
118
|
+
raise ValueError(
|
|
119
|
+
f"Failed to play sound at sample rate {sr} on speaker {i} (sample rate "
|
|
120
|
+
f"{spk.sampleRateHz}), original error: {err}"
|
|
121
|
+
)
|
|
122
|
+
# doesn't need to *actually* play, just check that it doesn't error
|
|
123
|
+
snd.stop()
|
|
43
124
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
#
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
s.
|
|
56
|
-
|
|
57
|
-
s.
|
|
58
|
-
core.wait(s.getDuration()*2+.1)
|
|
59
|
-
s.play(loops=-1)
|
|
60
|
-
s.stop()
|
|
61
|
-
|
|
62
|
-
def test_methods(self):
|
|
63
|
-
s = sound.Sound(secs=0.1)
|
|
64
|
-
v = s.getVolume()
|
|
65
|
-
assert v == 1
|
|
66
|
-
assert s.setVolume(0.5) == 0.5
|
|
67
|
-
#assert s.setLoops(2) == 2
|
|
125
|
+
def test_volume(self):
|
|
126
|
+
"""
|
|
127
|
+
Test that Sound can handle setting/getting its volume
|
|
128
|
+
"""
|
|
129
|
+
# make a basic sound
|
|
130
|
+
s = sound.Sound(value="A", secs=0.1)
|
|
131
|
+
# set volume
|
|
132
|
+
s.setVolume(1)
|
|
133
|
+
# check it
|
|
134
|
+
assert s.getVolume() == 1
|
|
135
|
+
# set to a different value
|
|
136
|
+
s.setVolume(0.5)
|
|
137
|
+
# check it
|
|
138
|
+
assert s.getVolume() == 0.5
|
|
@@ -114,34 +114,35 @@ def test_srgbTF():
|
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
@pytest.mark.colorspacetools
|
|
117
|
-
def
|
|
118
|
-
"""Test the CIE-
|
|
119
|
-
|
|
117
|
+
def test_cielch2rgb():
|
|
118
|
+
"""Test the CIE-LCh to linear RGB function.
|
|
120
119
|
"""
|
|
121
|
-
# preset CIE-
|
|
122
|
-
|
|
123
|
-
[0.0,
|
|
124
|
-
[100.0, 0.0,
|
|
125
|
-
[53.
|
|
126
|
-
[
|
|
127
|
-
[
|
|
128
|
-
[
|
|
129
|
-
[
|
|
130
|
-
[60.
|
|
120
|
+
# preset CIE-LCh colors
|
|
121
|
+
cielchColors = np.array([
|
|
122
|
+
[0.0, 0.0, 0.0], # black
|
|
123
|
+
[100.0, 0.0, 0.0], # white
|
|
124
|
+
[53.241, 104.552, 39.999], # red
|
|
125
|
+
[97.139, 96.905, 102.851], # yellow
|
|
126
|
+
[87.735, 119.776, 136.016], # green
|
|
127
|
+
[91.113, 50.121, 196.376], # cyan
|
|
128
|
+
[32.297, 133.808, 306.285], # blue
|
|
129
|
+
[60.324, 115.541, 328.235] # magenta
|
|
131
130
|
])
|
|
131
|
+
|
|
132
|
+
# test conversion using PsyhoPy RGB [-1:1] values
|
|
132
133
|
rgbExpected = np.array([
|
|
133
|
-
[-1
|
|
134
|
-
[
|
|
135
|
-
[1
|
|
136
|
-
[
|
|
137
|
-
[-1
|
|
138
|
-
[1
|
|
139
|
-
[-1
|
|
140
|
-
[1
|
|
134
|
+
[-1.0, -1.0, -1.0], # black
|
|
135
|
+
[ 1.0, 1.0, 1.0], # white
|
|
136
|
+
[ 1.0, -1.0, -1.0], # red
|
|
137
|
+
[ 1.0, 1.0, -1.0], # yellow
|
|
138
|
+
[-1.0, 1.0, -1.0], # green
|
|
139
|
+
[-1.0, 1.0, 1.0], # cyan
|
|
140
|
+
[-1.0, -1.0, 1.0], # blue
|
|
141
|
+
[ 1.0, -1.0, 1.0] # magenta
|
|
141
142
|
])
|
|
142
143
|
|
|
143
|
-
#
|
|
144
|
-
rgbOutD65 =
|
|
144
|
+
# do the conversion
|
|
145
|
+
rgbOutD65 = cielch2rgb(cielchColors)
|
|
145
146
|
assert np.allclose(rgbOutD65, rgbExpected, atol=0.01)
|
|
146
147
|
|
|
147
148
|
|
|
@@ -570,7 +570,7 @@ def test_invertMatrix():
|
|
|
570
570
|
# check homogeneous inverse
|
|
571
571
|
ident = np.identity(4)
|
|
572
572
|
for i in range(N):
|
|
573
|
-
r = rotationMatrix(angles[i], axes[i, :])
|
|
573
|
+
r = rotationMatrix(angles[i].item(), axes[i, :])
|
|
574
574
|
|
|
575
575
|
assert isOrthogonal(r)
|
|
576
576
|
|
|
@@ -593,7 +593,7 @@ def test_invertMatrix():
|
|
|
593
593
|
inv = np.zeros((4, 4))
|
|
594
594
|
ident = np.identity(4)
|
|
595
595
|
for i in range(N):
|
|
596
|
-
rotationMatrix(angles[i], axes[i, :], out=rout)
|
|
596
|
+
rotationMatrix(angles[i].item(), axes[i, :], out=rout)
|
|
597
597
|
|
|
598
598
|
assert isOrthogonal(rout)
|
|
599
599
|
|
|
@@ -615,23 +615,23 @@ def test_invertMatrix():
|
|
|
615
615
|
eyeOffsets = np.random.uniform(-0.1, 0.1, (N,))
|
|
616
616
|
|
|
617
617
|
for i in range(N):
|
|
618
|
-
scrWidth = scrDims[i, 0]
|
|
619
|
-
scrAspect =
|
|
620
|
-
viewDist = viewDists[i]
|
|
618
|
+
scrWidth = scrDims[i, 0].item()
|
|
619
|
+
scrAspect = scrWidth / scrDims[i, 1].item()
|
|
620
|
+
viewDist = viewDists[i].item()
|
|
621
621
|
|
|
622
622
|
# nearClip some distance between screen and eye
|
|
623
|
-
nearClip = np.random.uniform(0.1, viewDist, (1,))
|
|
623
|
+
nearClip = np.random.uniform(0.1, viewDist, (1,)).item()
|
|
624
624
|
|
|
625
625
|
# nearClip some distance beyond screen
|
|
626
626
|
fcMin = viewDist + nearClip
|
|
627
|
-
farClip = np.random.uniform(fcMin, 1000.0, (1,))
|
|
627
|
+
farClip = np.random.uniform(fcMin, 1000.0, (1,)).item()
|
|
628
628
|
|
|
629
629
|
# get projection matrix
|
|
630
630
|
frustum = computeFrustum(
|
|
631
631
|
scrWidth,
|
|
632
632
|
scrAspect,
|
|
633
633
|
viewDist,
|
|
634
|
-
eyeOffset=eyeOffsets[i],
|
|
634
|
+
eyeOffset=eyeOffsets[i].item(),
|
|
635
635
|
nearClip=nearClip,
|
|
636
636
|
farClip=farClip)
|
|
637
637
|
|
|
@@ -639,7 +639,7 @@ def test_invertMatrix():
|
|
|
639
639
|
assert not isAffine(proj)
|
|
640
640
|
|
|
641
641
|
# create affine view matrix
|
|
642
|
-
r = rotationMatrix(angles[i], axes[i, :])
|
|
642
|
+
r = rotationMatrix(angles[i].item(), axes[i, :])
|
|
643
643
|
assert isOrthogonal(r)
|
|
644
644
|
|
|
645
645
|
t = translationMatrix(trans[i, :])
|
|
@@ -2,11 +2,110 @@
|
|
|
2
2
|
"""Tests for psychopy.tools.viewtools
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
from psychopy.tools.mathtools import alignTo, lookAt, distance
|
|
5
6
|
from psychopy.tools.viewtools import *
|
|
6
7
|
import numpy as np
|
|
7
8
|
import pytest
|
|
8
9
|
|
|
9
10
|
|
|
11
|
+
@pytest.mark.viewtools
|
|
12
|
+
def test_visualAngle():
|
|
13
|
+
"""Test visual angle calculation.
|
|
14
|
+
|
|
15
|
+
This tests the visual angle calculation for a few values. The test is
|
|
16
|
+
performed by converting the visual angle back to a distance and checking if
|
|
17
|
+
it is the same as the original distance.
|
|
18
|
+
|
|
19
|
+
"""
|
|
20
|
+
# test calculation against value computed by hand
|
|
21
|
+
# obj distance = 0.57m, obj size = 0.01m
|
|
22
|
+
assert np.isclose(visualAngle(0.01, 0.57), 1.0051633) # ~1 degree
|
|
23
|
+
|
|
24
|
+
# test input vectorization
|
|
25
|
+
N = 1000
|
|
26
|
+
np.random.seed(12345)
|
|
27
|
+
distances = np.random.uniform(0.1, 100.0, (N,))
|
|
28
|
+
sizes = np.random.uniform(0.01, 10.0, (N,))
|
|
29
|
+
|
|
30
|
+
a = visualAngle(sizes, distances)
|
|
31
|
+
b = visualAngle(sizes, 0.57)
|
|
32
|
+
c = visualAngle(1.0, distances)
|
|
33
|
+
|
|
34
|
+
# make sure no values are >180 degrees or less than 0
|
|
35
|
+
assert np.all(a <= 180) and np.all(b <= 180) and np.all(c <= 180)
|
|
36
|
+
assert np.all(a >= 0) and np.all(b >= 0) and np.all(c >= 0)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.mark.viewtools
|
|
40
|
+
def test_viewMatrix():
|
|
41
|
+
"""Test view matrix generation.
|
|
42
|
+
|
|
43
|
+
This create a view matrix using `lookAt` and `viewMatrix` and checks if
|
|
44
|
+
they look at the same point.
|
|
45
|
+
|
|
46
|
+
"""
|
|
47
|
+
N = 1000
|
|
48
|
+
np.random.seed(12345)
|
|
49
|
+
targets = np.random.uniform(-100., 100., (N, 3,))
|
|
50
|
+
origin = [0, 0, 0]
|
|
51
|
+
orthoProj = orthoProjectionMatrix(-1, 1, -1, 1, 0.1, 100)
|
|
52
|
+
|
|
53
|
+
for i in range(N):
|
|
54
|
+
target = targets[i].tolist()
|
|
55
|
+
|
|
56
|
+
# View matrix generation using a quaternion will be canted, but will
|
|
57
|
+
# center on the same point
|
|
58
|
+
V0 = viewMatrix(origin, alignTo([0, 0, -1], target))
|
|
59
|
+
|
|
60
|
+
# Use `lookAt` to generate a view matrix, same as `gluLookAt`
|
|
61
|
+
V1 = lookAt(origin, target, [0, 1, 0])
|
|
62
|
+
|
|
63
|
+
# Check if the the matricies look at the same point if we project the
|
|
64
|
+
# target to NDC space. They should both be near the very center of the
|
|
65
|
+
# screen
|
|
66
|
+
posOut0 = pointToNdc(target, V0, orthoProj)
|
|
67
|
+
posOut1 = pointToNdc(target, V1, orthoProj)
|
|
68
|
+
|
|
69
|
+
assert np.isclose(posOut0, posOut1).all()
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@pytest.mark.viewtools
|
|
73
|
+
def test_projectFrustumToPlane():
|
|
74
|
+
"""Test the projection of the frustum to a plane.
|
|
75
|
+
"""
|
|
76
|
+
N = 1000
|
|
77
|
+
np.random.seed(12345)
|
|
78
|
+
nearClip = 0.025
|
|
79
|
+
scrDims = np.random.uniform(0.01, 10.0, (N, 2,))
|
|
80
|
+
viewDists = np.random.uniform(nearClip, 10.0, (N,))
|
|
81
|
+
eyeOffsets = np.random.uniform(-0.1, 0.1, (N,))
|
|
82
|
+
|
|
83
|
+
for i in range(N):
|
|
84
|
+
scrWidth = scrDims[i, 0]
|
|
85
|
+
scrAspect = scrDims[i, 0] / scrDims[i, 1]
|
|
86
|
+
scrHeight = scrWidth * (1.0 / scrAspect)
|
|
87
|
+
viewDist = viewDists[i]
|
|
88
|
+
|
|
89
|
+
farClip = viewDist
|
|
90
|
+
|
|
91
|
+
frustum = computeFrustum(
|
|
92
|
+
scrWidth,
|
|
93
|
+
scrAspect,
|
|
94
|
+
viewDist,
|
|
95
|
+
eyeOffset=eyeOffsets[i],
|
|
96
|
+
nearClip=nearClip,
|
|
97
|
+
farClip=farClip)
|
|
98
|
+
|
|
99
|
+
frustum = [v.item() for v in frustum]
|
|
100
|
+
|
|
101
|
+
topLeft, bottomLeft, _, topRight = projectFrustumToPlane(
|
|
102
|
+
frustum, viewDist)
|
|
103
|
+
|
|
104
|
+
# should match the screen dimensions
|
|
105
|
+
assert (np.isclose(distance(topLeft, topRight), scrWidth) and
|
|
106
|
+
np.isclose(distance(topLeft, bottomLeft), scrHeight))
|
|
107
|
+
|
|
108
|
+
|
|
10
109
|
@pytest.mark.viewtools
|
|
11
110
|
def test_frustumToProjectionMatrix():
|
|
12
111
|
"""Ensure the `computeFrustum` + `perspectiveProjectionMatrix` and
|
|
@@ -40,6 +139,8 @@ def test_frustumToProjectionMatrix():
|
|
|
40
139
|
eyeOffset=eyeOffsets[i],
|
|
41
140
|
nearClip=nearClip,
|
|
42
141
|
farClip=farClip)
|
|
142
|
+
|
|
143
|
+
frustum = [v.item() for v in frustum] # ensure scalars
|
|
43
144
|
|
|
44
145
|
P = perspectiveProjectionMatrix(*frustum)
|
|
45
146
|
|
|
File without changes
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from psychopy import core, constants, sound, validation
|
|
3
|
+
from psychopy.hardware import microphone, soundsensor, DeviceManager
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@pytest.mark.needs_sound
|
|
7
|
+
class TestAudioValidator:
|
|
8
|
+
def setup_class(cls):
|
|
9
|
+
cls.vk = cls.speaker = None
|
|
10
|
+
# find best vk/speaker pair to use
|
|
11
|
+
for profile in DeviceManager.getAvailableDevices(
|
|
12
|
+
"psychopy.hardware.soundsensor.MicrophoneSoundSensorEmulator"
|
|
13
|
+
):
|
|
14
|
+
# setup sound sensor
|
|
15
|
+
try:
|
|
16
|
+
# make sure the mic exists
|
|
17
|
+
if not DeviceManager.getDevice(profile['device']):
|
|
18
|
+
for micProfile in DeviceManager.getAvailableDevices(
|
|
19
|
+
"psychopy.hardware.microphone.MicrophoneDevice"
|
|
20
|
+
):
|
|
21
|
+
if micProfile['index'] == profile['device']:
|
|
22
|
+
DeviceManager.addDevice(**micProfile)
|
|
23
|
+
# create sound sensor emulator
|
|
24
|
+
vk = DeviceManager.addDevice(**profile)
|
|
25
|
+
except Exception as err:
|
|
26
|
+
continue
|
|
27
|
+
# find matching speakers
|
|
28
|
+
foundSpeakers = vk.findSpeakers(channel=0)
|
|
29
|
+
# check that speakers can be initialised
|
|
30
|
+
for speaker in foundSpeakers:
|
|
31
|
+
try:
|
|
32
|
+
sound.Sound("A", speaker=speaker)
|
|
33
|
+
except:
|
|
34
|
+
continue
|
|
35
|
+
else:
|
|
36
|
+
# if successful, we have a matching pair!
|
|
37
|
+
cls.speaker = speaker
|
|
38
|
+
cls.vk = vk
|
|
39
|
+
# skip if no devices were found
|
|
40
|
+
if cls.vk is None or cls.speaker is None:
|
|
41
|
+
pytest.skip()
|
|
42
|
+
# create validator
|
|
43
|
+
cls.validator = validation.AudioValidator(cls.vk)
|
|
44
|
+
|
|
45
|
+
def test_soundHeard(self):
|
|
46
|
+
"""
|
|
47
|
+
Check that the sound sensor validator detects a sound played from an audible speaker.
|
|
48
|
+
"""
|
|
49
|
+
# setup timing
|
|
50
|
+
clock = core.Clock()
|
|
51
|
+
self.validator.resetTimer(clock)
|
|
52
|
+
t = 0
|
|
53
|
+
# setup sound
|
|
54
|
+
snd = sound.Sound("A", speaker=self.speaker)
|
|
55
|
+
snd.tStart = snd.tStop = None
|
|
56
|
+
# set starting statuses
|
|
57
|
+
snd.status = self.validator.status = constants.NOT_STARTED
|
|
58
|
+
# begin a frame loop
|
|
59
|
+
while t < 3:
|
|
60
|
+
t = clock.getTime()
|
|
61
|
+
# validate start
|
|
62
|
+
if self.validator.status == constants.STARTED and snd.status == constants.STARTED:
|
|
63
|
+
self.validator.tStart, self.validator.valid = self.validator.validate(
|
|
64
|
+
state=True,
|
|
65
|
+
t=snd.tStart,
|
|
66
|
+
adjustment=0.12
|
|
67
|
+
)
|
|
68
|
+
if self.validator.tStart:
|
|
69
|
+
self.validator.status = constants.FINISHED
|
|
70
|
+
assert self.validator.valid
|
|
71
|
+
# validate stop
|
|
72
|
+
if self.validator.status == constants.STARTED and snd.status == constants.FINISHED:
|
|
73
|
+
self.validator.tStop, self.validator.valid = self.validator.validate(
|
|
74
|
+
state=False,
|
|
75
|
+
t=snd.tStop,
|
|
76
|
+
adjustment=0
|
|
77
|
+
)
|
|
78
|
+
if self.validator.tStop:
|
|
79
|
+
self.validator.status = constants.FINISHED
|
|
80
|
+
assert self.validator.valid
|
|
81
|
+
# start sound
|
|
82
|
+
if snd.status == constants.NOT_STARTED and t > 1:
|
|
83
|
+
snd.play()
|
|
84
|
+
snd.tStart = t
|
|
85
|
+
snd.status = constants.STARTED
|
|
86
|
+
self.validator.status = constants.STARTED
|
|
87
|
+
# stop sound
|
|
88
|
+
if snd.status == constants.STARTED and t > 2:
|
|
89
|
+
snd.stop()
|
|
90
|
+
snd.tStop = t
|
|
91
|
+
snd.status = constants.FINISHED
|
|
92
|
+
self.validator.status = constants.STARTED
|
|
93
|
+
# make sure the validator got some times
|
|
94
|
+
assert self.validator.tStart is not None
|
|
95
|
+
assert self.validator.tStop is not None
|
|
@@ -227,7 +227,7 @@ class _baseVisualTest():
|
|
|
227
227
|
def test_text(self):
|
|
228
228
|
win = self.win
|
|
229
229
|
#set font
|
|
230
|
-
fontFile = str(
|
|
230
|
+
fontFile = str(utils.TESTS_FONT)
|
|
231
231
|
#using init
|
|
232
232
|
stim = visual.TextStim(win,text=u'\u03A8a', color=[0.5, 1.0, 1.0], ori=15,
|
|
233
233
|
height=0.8*self.scaleFactor, pos=[0,0], font='DejaVu Serif',
|
|
@@ -395,7 +395,7 @@ class _baseVisualTest():
|
|
|
395
395
|
"dots._dotsDir failed to change after dots.setDir()"
|
|
396
396
|
assert prevSignals.sum()!=dots._signalDots.sum(), \
|
|
397
397
|
"dots._signalDots failed to change after dots.setCoherence()"
|
|
398
|
-
assert not numpy.
|
|
398
|
+
assert not numpy.all(prevVerticesPix==dots.verticesPix), \
|
|
399
399
|
"dots.verticesPix failed to change after dots.setPos()"
|
|
400
400
|
|
|
401
401
|
def test_element_array(self):
|
|
@@ -1,14 +1,40 @@
|
|
|
1
1
|
import json
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
|
|
4
2
|
import pytest
|
|
5
|
-
|
|
6
|
-
from psychopy import colors
|
|
7
|
-
from psychopy.monitors import Monitor
|
|
3
|
+
import importlib
|
|
8
4
|
from copy import copy
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from psychopy import visual, layout, event, colors
|
|
7
|
+
from psychopy.tools.stimulustools import serialize, actualize
|
|
8
|
+
from psychopy.monitors import Monitor
|
|
9
9
|
from psychopy.tests import utils
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
class _TestSerializationMixin:
|
|
13
|
+
"""
|
|
14
|
+
Tests that stimuli can be serialized and recreated from serialized form.
|
|
15
|
+
"""
|
|
16
|
+
# placeholders for object and window
|
|
17
|
+
obj = None
|
|
18
|
+
win = None
|
|
19
|
+
|
|
20
|
+
def test_serialization(self):
|
|
21
|
+
# skip if we don't have an object
|
|
22
|
+
if self.obj is None or self.win is None:
|
|
23
|
+
pytest.skip()
|
|
24
|
+
# start by flipping the window
|
|
25
|
+
self.win.flip()
|
|
26
|
+
# serialize object
|
|
27
|
+
params = serialize(self.obj, includeClass=True)
|
|
28
|
+
# substitute win
|
|
29
|
+
params['win'] = self.win
|
|
30
|
+
# recreate object from params
|
|
31
|
+
dupe = actualize(params)
|
|
32
|
+
# check object is same class
|
|
33
|
+
assert isinstance(dupe, type(self.obj))
|
|
34
|
+
# delete duplicate
|
|
35
|
+
del dupe
|
|
36
|
+
|
|
37
|
+
|
|
12
38
|
class _TestColorMixin:
|
|
13
39
|
# Define expected values for different spaces
|
|
14
40
|
colorExemplars = [
|
|
@@ -61,6 +87,10 @@ class _TestColorMixin:
|
|
|
61
87
|
# If this test object has no obj, skip
|
|
62
88
|
if not self.obj:
|
|
63
89
|
return
|
|
90
|
+
|
|
91
|
+
if hasattr(self, 'resetObj'):
|
|
92
|
+
self.resetObj() # reset the stimulus object before this test
|
|
93
|
+
|
|
64
94
|
# Test each case
|
|
65
95
|
for case in self.colorTykes + self.colorExemplars:
|
|
66
96
|
for space, color in case.items():
|
|
@@ -478,7 +508,7 @@ class _TestUnitsMixin:
|
|
|
478
508
|
obj.win = win
|
|
479
509
|
obj.units = objunits
|
|
480
510
|
# Add a label for the units
|
|
481
|
-
label = visual.TextBox2(win, text=f"Window: {winunits}, Slider: {objunits}", font="
|
|
511
|
+
label = visual.TextBox2(win, text=f"Window: {winunits}, Slider: {objunits}", font="Noto Sans",
|
|
482
512
|
anchor="top-center", alignment="center top", padding=0.05, units="norm",
|
|
483
513
|
pos=(0, 1))
|
|
484
514
|
# Add instructions
|
|
@@ -486,7 +516,7 @@ class _TestUnitsMixin:
|
|
|
486
516
|
text=(
|
|
487
517
|
f"Press ENTER if object is functioning as intended, otherwise press "
|
|
488
518
|
f"any other key."
|
|
489
|
-
), font="
|
|
519
|
+
), font="Noto Sans", anchor="top-center", alignment="center bottom",
|
|
490
520
|
padding=0.05, units="norm", pos=(0, -1))
|
|
491
521
|
# Draw loop until button is pressed
|
|
492
522
|
keys = []
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from psychopy import visual
|
|
2
|
-
from psychopy.tests.test_visual.test_basevisual import _TestColorMixin
|
|
2
|
+
from psychopy.tests.test_visual.test_basevisual import _TestColorMixin, _TestSerializationMixin
|
|
3
3
|
from psychopy.tests.test_experiment.test_component_compile_python import _TestBoilerplateMixin
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class TestButton(_TestColorMixin, _TestBoilerplateMixin):
|
|
6
|
+
class TestButton(_TestColorMixin, _TestBoilerplateMixin, _TestSerializationMixin):
|
|
7
7
|
|
|
8
8
|
@classmethod
|
|
9
9
|
def setup_class(self):
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
2
|
|
|
3
3
|
import pytest
|
|
4
|
+
import copy
|
|
4
5
|
from psychopy import visual
|
|
5
|
-
from .test_basevisual import _TestColorMixin, _TestUnitsMixin
|
|
6
|
+
from .test_basevisual import _TestColorMixin, _TestUnitsMixin, _TestSerializationMixin
|
|
6
7
|
from psychopy.tests.test_experiment.test_component_compile_python import _TestBoilerplateMixin
|
|
7
8
|
from .. import utils
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
class TestCircle(_TestColorMixin, _TestUnitsMixin, _TestBoilerplateMixin):
|
|
11
|
+
class TestCircle(_TestColorMixin, _TestUnitsMixin, _TestBoilerplateMixin, _TestSerializationMixin):
|
|
11
12
|
|
|
12
13
|
@classmethod
|
|
13
14
|
def setup_class(self):
|
|
@@ -24,6 +25,12 @@ class TestCircle(_TestColorMixin, _TestUnitsMixin, _TestBoilerplateMixin):
|
|
|
24
25
|
# Shape has no foreground color
|
|
25
26
|
self.foreUsed = False
|
|
26
27
|
|
|
28
|
+
def resetObj(self):
|
|
29
|
+
"""Reset the stimulus to its initial state.
|
|
30
|
+
"""
|
|
31
|
+
self.obj = visual.Circle(
|
|
32
|
+
self.win, units="pix", pos=(0, 0), size=(128, 128), lineWidth=3)
|
|
33
|
+
|
|
27
34
|
def test_radius(self):
|
|
28
35
|
# Define some use cases
|
|
29
36
|
cases = [
|
|
@@ -64,3 +71,4 @@ class TestCircle(_TestColorMixin, _TestUnitsMixin, _TestBoilerplateMixin):
|
|
|
64
71
|
self.obj.draw()
|
|
65
72
|
# self.win.getMovieFrame(buffer='back').save(Path(utils.TESTS_DATA_PATH) / filename)
|
|
66
73
|
# utils.compareScreenshot(Path(utils.TESTS_DATA_PATH) / filename, self.win, crit=20)
|
|
74
|
+
|