psychopy 2024.2.5__py3-none-any.whl → 2025.1.1__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 +4 -4
- psychopy/GIT_SHA +1 -1
- 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 +4 -4
- 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 +19 -7
- 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 +12 -5
- 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 +2 -2
- 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/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp +312 -0
- 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 +30 -9
- 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 +18 -5
- 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 +535 -155
- 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/devices/eyetracker/__init__.py +10 -18
- psychopy/iohub/devices/eyetracker/calibration/procedure.py +15 -33
- psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +2 -2
- psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +1 -0
- psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +10 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +1 -0
- psychopy/iohub/devices/mouse/linux2.py +2 -1
- 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_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_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/__init__.py +0 -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 +2967 -559
- 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 +4 -2
- 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 +374 -201
- psychopy/web.py +1 -1
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/METADATA +13 -12
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/RECORD +647 -624
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/WHEEL +1 -1
- 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/ar_001/.DS_Store +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/.DS_Store +0 -0
- psychopy/core.py.orig +0 -169
- psychopy/demos/builder/.DS_Store +0 -0
- 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/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_lastrun.py +0 -562
- 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/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/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/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/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/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/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.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.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-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/entry_points.txt +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -4,7 +4,6 @@ import wx
|
|
|
4
4
|
import os
|
|
5
5
|
import sys
|
|
6
6
|
import subprocess as sp
|
|
7
|
-
from pypi_search import search as pypi
|
|
8
7
|
|
|
9
8
|
from psychopy.app import utils
|
|
10
9
|
from psychopy.app.themes import handlers, icons
|
|
@@ -63,17 +62,16 @@ class PIPTerminalPanel(wx.Panel):
|
|
|
63
62
|
):
|
|
64
63
|
executable = f'"{executable}"'
|
|
65
64
|
# Construct preface
|
|
66
|
-
self.preface = " ".join([executable, "-m"])
|
|
65
|
+
self.preface = " ".join([executable, "-m", "pip"])
|
|
67
66
|
# Add output
|
|
68
67
|
self.output = wx.richtext.RichTextCtrl(
|
|
69
68
|
self,
|
|
70
69
|
value=_translate(
|
|
71
|
-
"Type
|
|
72
|
-
"returned text will appear below.\n"
|
|
70
|
+
"Type pip commands below and press Enter to execute them in the installed PsychoPy environment, any returned text will appear below. When installing, remember to add `--user` on the end!\n"
|
|
73
71
|
"\n"
|
|
74
72
|
"All commands will be automatically prefaced with:\n"
|
|
75
73
|
"{}\n"
|
|
76
|
-
"\n"
|
|
74
|
+
"(so you don't need to type it yourself)\n"
|
|
77
75
|
).format(self.preface),
|
|
78
76
|
size=(480, -1),
|
|
79
77
|
style=wx.TE_READONLY)
|
|
@@ -277,19 +275,17 @@ class PackageListCtrl(wx.Panel):
|
|
|
277
275
|
# Add column for latest version if we're actually searching
|
|
278
276
|
self.ctrl.AppendColumn(_translate("Latest"))
|
|
279
277
|
# Get packages from search
|
|
280
|
-
foundPackages = pypi.find_packages(self.searchCtrl.GetValue())
|
|
281
278
|
# Populate
|
|
282
|
-
for pkg in
|
|
279
|
+
for pkg, version in installedPackages.items():
|
|
280
|
+
if pkg is None:
|
|
281
|
+
continue
|
|
283
282
|
font = wx.Font()
|
|
284
|
-
if
|
|
283
|
+
if searchTerm in pkg:
|
|
285
284
|
# If installed, add row with value for installed version
|
|
286
|
-
item = self.ctrl.Append((pkg
|
|
285
|
+
item = self.ctrl.Append((pkg, version))
|
|
287
286
|
font = font.Bold()
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
item = self.ctrl.Append((pkg['name'], "-", pkg['version']))
|
|
291
|
-
# Style new row according to install status
|
|
292
|
-
self.ctrl.SetItemFont(item, font)
|
|
287
|
+
# Style new row according to install status
|
|
288
|
+
self.ctrl.SetItemFont(item, font)
|
|
293
289
|
|
|
294
290
|
def onAddFromFile(self, evt=None):
|
|
295
291
|
# Create dialog to get package file location
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
|
+
from packaging.version import Version
|
|
2
3
|
import shutil
|
|
3
4
|
|
|
4
5
|
import wx
|
|
@@ -209,12 +210,12 @@ class PluginInfo:
|
|
|
209
210
|
current.remove(self.pipname)
|
|
210
211
|
plugins.startUpPlugins(current, add=False, verify=False)
|
|
211
212
|
|
|
212
|
-
def install(self):
|
|
213
|
+
def install(self, forceReinstall=False):
|
|
213
214
|
if self.parent is None:
|
|
214
215
|
return
|
|
215
216
|
|
|
216
217
|
wx.CallAfter(
|
|
217
|
-
self.parent.GetTopLevelParent().installPlugin, self)
|
|
218
|
+
self.parent.GetTopLevelParent().installPlugin, self, forceReinstall=forceReinstall)
|
|
218
219
|
|
|
219
220
|
def uninstall(self):
|
|
220
221
|
if self.parent is None:
|
|
@@ -227,6 +228,23 @@ class PluginInfo:
|
|
|
227
228
|
def installed(self):
|
|
228
229
|
return pkgtools.isInstalled(self.pipname)
|
|
229
230
|
|
|
231
|
+
@property
|
|
232
|
+
def installedVersion(self):
|
|
233
|
+
"""
|
|
234
|
+
Returns
|
|
235
|
+
-------
|
|
236
|
+
Version or None
|
|
237
|
+
The version of this plugin which is installed, or None if it is not installed.
|
|
238
|
+
"""
|
|
239
|
+
if self.installed:
|
|
240
|
+
try:
|
|
241
|
+
ver = plugins.pluginMetadata(self.pipname)["Version"]
|
|
242
|
+
return Version(ver)
|
|
243
|
+
except:
|
|
244
|
+
return None
|
|
245
|
+
else:
|
|
246
|
+
return None
|
|
247
|
+
|
|
230
248
|
@property
|
|
231
249
|
def author(self):
|
|
232
250
|
if hasattr(self, "_author"):
|
|
@@ -243,6 +261,28 @@ class PluginInfo:
|
|
|
243
261
|
else:
|
|
244
262
|
# Otherwise, assume no author
|
|
245
263
|
self._author = AuthorInfo()
|
|
264
|
+
|
|
265
|
+
def getReleases(self):
|
|
266
|
+
"""
|
|
267
|
+
Get known versions of this plugin.
|
|
268
|
+
|
|
269
|
+
Returns
|
|
270
|
+
-------
|
|
271
|
+
list[str]
|
|
272
|
+
List of version strings
|
|
273
|
+
"""
|
|
274
|
+
# get package info
|
|
275
|
+
info = pkgtools.getPypiInfo(self.pipname, silence=True)
|
|
276
|
+
# convert all release numbers to Version objects
|
|
277
|
+
releases = []
|
|
278
|
+
for release in info.get('releases', []):
|
|
279
|
+
try:
|
|
280
|
+
ver = Version(release)
|
|
281
|
+
releases.append(ver)
|
|
282
|
+
except:
|
|
283
|
+
continue
|
|
284
|
+
|
|
285
|
+
return releases
|
|
246
286
|
|
|
247
287
|
|
|
248
288
|
class PluginManagerPanel(wx.Panel, handlers.ThemeMixin):
|
|
@@ -764,6 +804,13 @@ class PluginDetailsPanel(wx.Panel, handlers.ThemeMixin):
|
|
|
764
804
|
self.installBtn.SetBitmapMargins(6, 3)
|
|
765
805
|
self.installBtn.Bind(wx.EVT_BUTTON, self.onInstall)
|
|
766
806
|
self.buttonSizer.Add(self.installBtn, border=3, flag=wx.ALL | wx.EXPAND)
|
|
807
|
+
# update btn
|
|
808
|
+
self.updateBtn = wx.Button(self, label=_translate("Update"))
|
|
809
|
+
self.updateBtn.SetBitmap(
|
|
810
|
+
icons.ButtonIcon("plus", 16).bitmap
|
|
811
|
+
)
|
|
812
|
+
self.updateBtn.Bind(wx.EVT_BUTTON, self.onUpdate)
|
|
813
|
+
self.buttonSizer.Add(self.updateBtn, border=3, flag=wx.ALL | wx.EXPAND)
|
|
767
814
|
# uninstall btn
|
|
768
815
|
self.uninstallBtn = wx.Button(self, label=_translate("Uninstall"))
|
|
769
816
|
self.uninstallBtn.SetBitmap(
|
|
@@ -867,14 +914,14 @@ class PluginDetailsPanel(wx.Panel, handlers.ThemeMixin):
|
|
|
867
914
|
active=active
|
|
868
915
|
)
|
|
869
916
|
|
|
870
|
-
def _doInstall(self):
|
|
917
|
+
def _doInstall(self, forceReinstall=None):
|
|
871
918
|
"""Routine to run the installation of a package after the `onInstall`
|
|
872
919
|
event is processed.
|
|
873
920
|
"""
|
|
874
921
|
# mark as pending
|
|
875
922
|
self.markInstalled(None)
|
|
876
923
|
# install
|
|
877
|
-
self.info.install()
|
|
924
|
+
self.info.install(forceReinstall=forceReinstall)
|
|
878
925
|
# mark according to install success
|
|
879
926
|
self.markInstalled(self.info.installed)
|
|
880
927
|
|
|
@@ -893,6 +940,11 @@ class PluginDetailsPanel(wx.Panel, handlers.ThemeMixin):
|
|
|
893
940
|
if evt is not None and hasattr(evt, 'Skip'):
|
|
894
941
|
evt.Skip()
|
|
895
942
|
|
|
943
|
+
def onUpdate(self, evt=None):
|
|
944
|
+
wx.CallAfter(self._doInstall, forceReinstall=True) # call after processing button events
|
|
945
|
+
if evt is not None and hasattr(evt, 'Skip'):
|
|
946
|
+
evt.Skip()
|
|
947
|
+
|
|
896
948
|
def onUninstall(self, evt=None):
|
|
897
949
|
"""
|
|
898
950
|
Event called when the uninstall button is clicked.
|
|
@@ -993,6 +1045,14 @@ class PluginDetailsPanel(wx.Panel, handlers.ThemeMixin):
|
|
|
993
1045
|
self.pipName.SetLabelText(value.pipname)
|
|
994
1046
|
# Set installed
|
|
995
1047
|
self.markInstalled(value.installed)
|
|
1048
|
+
# show/hide update button
|
|
1049
|
+
releases = self.info.getReleases()
|
|
1050
|
+
if releases:
|
|
1051
|
+
self.updateBtn.Show(
|
|
1052
|
+
self.info.installed
|
|
1053
|
+
and self.info.installedVersion is not None
|
|
1054
|
+
and self.info.installedVersion < max(releases)
|
|
1055
|
+
)
|
|
996
1056
|
# Enable/disable homepage
|
|
997
1057
|
self.homepageBtn.Enable(bool(self.info.homepage))
|
|
998
1058
|
# Set activated
|
psychopy/app/preferencesDlg.py
CHANGED
|
@@ -12,11 +12,11 @@ import re
|
|
|
12
12
|
import os
|
|
13
13
|
|
|
14
14
|
from psychopy.app.themes import icons
|
|
15
|
+
from psychopy.hardware.speaker import SpeakerDevice
|
|
15
16
|
from . import dialogs
|
|
16
17
|
from psychopy import localization, prefs
|
|
17
18
|
from psychopy.localization import _translate
|
|
18
19
|
from packaging.version import Version
|
|
19
|
-
from psychopy import sound
|
|
20
20
|
from psychopy.app.utils import getSystemFonts
|
|
21
21
|
import collections
|
|
22
22
|
|
|
@@ -243,7 +243,7 @@ class PrefPropGrid(wx.Panel):
|
|
|
243
243
|
pagePtr.Clear()
|
|
244
244
|
|
|
245
245
|
for s in sections:
|
|
246
|
-
_ = pagePtr.Append(pg.PropertyCategory(s, s))
|
|
246
|
+
_ = pagePtr.Append(pg.PropertyCategory(_translate(s), s))
|
|
247
247
|
for name, prop in self.sections[s].items():
|
|
248
248
|
if name in prefs.legacy:
|
|
249
249
|
# If this is included in the config file only for legacy, don't show it
|
|
@@ -429,7 +429,12 @@ class PreferencesDlg(wx.Dialog):
|
|
|
429
429
|
|
|
430
430
|
# get sound devices for "audioDevice" property
|
|
431
431
|
try:
|
|
432
|
-
devnames =
|
|
432
|
+
devnames = [profile['deviceName'] for profile in SpeakerDevice.getAvailableDevices()]
|
|
433
|
+
# prefs need to have a default value, but we need an actual device - so remove it from
|
|
434
|
+
# the dialog
|
|
435
|
+
if 'default' in devnames:
|
|
436
|
+
devnames.pop('default')
|
|
437
|
+
|
|
433
438
|
except (ValueError, OSError, ImportError, AttributeError):
|
|
434
439
|
devnames = []
|
|
435
440
|
|
|
@@ -468,7 +473,7 @@ class PreferencesDlg(wx.Dialog):
|
|
|
468
473
|
thisPref = thisPref.replace('Ctrl+', 'Cmd+')
|
|
469
474
|
|
|
470
475
|
# can we translate this pref?
|
|
471
|
-
pLabel = prefName
|
|
476
|
+
pLabel = _translate(prefName)
|
|
472
477
|
|
|
473
478
|
# get tooltips from comment lines from the spec, as parsed by
|
|
474
479
|
# configobj
|
|
@@ -552,36 +557,6 @@ class PreferencesDlg(wx.Dialog):
|
|
|
552
557
|
labels=labels,
|
|
553
558
|
values=[i for i in range(len(labels))],
|
|
554
559
|
value=default, helpText=helpText)
|
|
555
|
-
# # audio latency mode for the PTB driver
|
|
556
|
-
elif prefName == 'audioLatencyMode':
|
|
557
|
-
# get the labels from above
|
|
558
|
-
labels = []
|
|
559
|
-
for val, labl in audioLatencyLabels.items():
|
|
560
|
-
labels.append(u'{}: {}'.format(val, labl))
|
|
561
|
-
|
|
562
|
-
# get the options from the config file spec
|
|
563
|
-
vals = thisSpec.replace("option(", "").replace("'", "")
|
|
564
|
-
# item -1 is 'default=x' from spec
|
|
565
|
-
vals = vals.replace(", ", ",").split(',')
|
|
566
|
-
|
|
567
|
-
try:
|
|
568
|
-
# set the field to the value in the pref
|
|
569
|
-
default = int(thisPref)
|
|
570
|
-
except ValueError:
|
|
571
|
-
try:
|
|
572
|
-
# use first if default not in list
|
|
573
|
-
default = int(vals[-1].strip('()').split('=')[1])
|
|
574
|
-
except (IndexError, TypeError, ValueError):
|
|
575
|
-
# no default
|
|
576
|
-
default = 0
|
|
577
|
-
|
|
578
|
-
self.proPrefs.addEnumItem(
|
|
579
|
-
sectionName,
|
|
580
|
-
pLabel,
|
|
581
|
-
prefName,
|
|
582
|
-
labels=labels,
|
|
583
|
-
values=[i for i in range(len(labels))],
|
|
584
|
-
value=default, helpText=helpText)
|
|
585
560
|
# # option items are given a dropdown, current value is shown
|
|
586
561
|
# # in the box
|
|
587
562
|
elif thisSpec.startswith('option') or prefName == 'audioDevice':
|
|
@@ -610,7 +585,7 @@ class PreferencesDlg(wx.Dialog):
|
|
|
610
585
|
|
|
611
586
|
labels = [] # display only
|
|
612
587
|
for opt in options:
|
|
613
|
-
labels.append(opt)
|
|
588
|
+
labels.append(_translate(opt))
|
|
614
589
|
|
|
615
590
|
self.proPrefs.addEnumItem(
|
|
616
591
|
sectionName,
|
|
@@ -701,8 +676,8 @@ class PreferencesDlg(wx.Dialog):
|
|
|
701
676
|
newVal = eval(thisPref)
|
|
702
677
|
except Exception:
|
|
703
678
|
# if eval() failed, show warning dialog and return
|
|
704
|
-
pLabel = prefName
|
|
705
|
-
sLabel = sectionName
|
|
679
|
+
pLabel = _translate(prefName)
|
|
680
|
+
sLabel = _translate(sectionName)
|
|
706
681
|
txt = _translate(
|
|
707
682
|
'Invalid value in "%(pref)s" ("%(section)s" Tab)')
|
|
708
683
|
msg = txt % {'pref': pLabel, 'section': sLabel}
|
psychopy/app/psychopyApp.py
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
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
|
+
import argparse
|
|
9
|
+
from pathlib import Path
|
|
8
10
|
import sys
|
|
9
11
|
|
|
10
12
|
# fix macOS locale-bug on startup: sets locale to LC_ALL (must be defined!)
|
|
@@ -16,58 +18,130 @@ import psychopy.locale_setup # noqa
|
|
|
16
18
|
# file now used solely as a launcher for the app, not as the app itself.
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
def
|
|
21
|
+
def main():
|
|
20
22
|
from psychopy.app import startApp, quitApp
|
|
21
23
|
from psychopy.preferences import prefs
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
_ = startApp(showSplash=showSplash) # main loop
|
|
28
|
-
quitApp()
|
|
25
|
+
# parser to process input arguments
|
|
26
|
+
argParser = argparse.ArgumentParser(
|
|
27
|
+
prog="PsychoPyApp", description=(
|
|
28
|
+
"""Starts the PsychoPy application.
|
|
29
29
|
|
|
30
|
+
Usage: python psychopy.app [options] [files]
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
Without options or files provided this starts PsychoPy using prefs to
|
|
33
|
+
decide on the view(s) to open. If optional [files] is provided action
|
|
34
|
+
depends on the type of the [files]:
|
|
35
|
+
|
|
36
|
+
Python script 'file.py' -- opens coder
|
|
37
|
+
|
|
38
|
+
Experiment design 'file.psyexp' -- opens builder
|
|
39
|
+
"""
|
|
40
|
+
)
|
|
41
|
+
)
|
|
42
|
+
# first argument is always the calling script
|
|
43
|
+
argParser.add_argument("callscript")
|
|
44
|
+
# recognise version query
|
|
45
|
+
argParser.add_argument(
|
|
46
|
+
"--version", "-v", dest="version", action="store_true", help=(
|
|
47
|
+
"Print the current PsychoPy version."
|
|
48
|
+
))
|
|
49
|
+
# add option to directly run a script
|
|
50
|
+
argParser.add_argument(
|
|
51
|
+
"--direct", "-x", dest="direct", action="store_true", help=(
|
|
52
|
+
"Use PsychoPy to run a Python script (.py) or a PsychoPy experiment (.psyexp), without "
|
|
53
|
+
"opening the app."
|
|
54
|
+
)
|
|
55
|
+
)
|
|
56
|
+
# add options for starting view
|
|
57
|
+
argParser.add_argument(
|
|
58
|
+
"--builder", "-b", dest="startView", const="builder", action="append_const", help=(
|
|
59
|
+
"Open PsychoPy with a Builder window open. Combine with --coder/-c and --runner/-r "
|
|
60
|
+
"to open a specific set of frames."
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
argParser.add_argument(
|
|
64
|
+
"--coder", "-c", dest="startView", const="coder", action="append_const", help=(
|
|
65
|
+
"Open PsychoPy with the Coder window open. Combine with --builder/-b and --runner/-r "
|
|
66
|
+
"to open a specific set of frames."
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
argParser.add_argument(
|
|
70
|
+
"--runner", "-r", dest="startView", const="runner", action="append_const", help=(
|
|
71
|
+
"Open PsychoPy with the Runner window open. Combine with --coder/-c and --builder/-b "
|
|
72
|
+
"to open a specific set of frames."
|
|
73
|
+
)
|
|
74
|
+
)
|
|
75
|
+
# add option to show config wizard
|
|
76
|
+
argParser.add_argument(
|
|
77
|
+
"--firstrun", dest="firstRun", action="store_true", help=(
|
|
78
|
+
"Launches configuration wizard"
|
|
79
|
+
)
|
|
80
|
+
)
|
|
81
|
+
# add option to hide splash
|
|
82
|
+
argParser.add_argument(
|
|
83
|
+
"--no-splash", dest="showSplash", action="store_false", default=prefs.app['showSplash'], help=(
|
|
84
|
+
"Suppresses splash screen"
|
|
85
|
+
)
|
|
86
|
+
)
|
|
87
|
+
# add option to include app profiling
|
|
88
|
+
argParser.add_argument(
|
|
89
|
+
"--profiling", dest="profiling", action="store_true", help=(
|
|
90
|
+
"Launches app with profiling to see what specific processes are taking up resources."
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
# parse args
|
|
94
|
+
args, startFilesRaw = argParser.parse_known_args(sys.argv)
|
|
95
|
+
# pathify startFiles
|
|
96
|
+
startFiles = None
|
|
97
|
+
for thisFile in startFilesRaw:
|
|
98
|
+
if startFiles is None:
|
|
99
|
+
startFiles = []
|
|
100
|
+
try:
|
|
101
|
+
startFiles.append(Path(thisFile))
|
|
102
|
+
except:
|
|
103
|
+
print(
|
|
104
|
+
"Could not interpret {} as a path.".format(thisFile)
|
|
105
|
+
)
|
|
106
|
+
continue
|
|
107
|
+
|
|
108
|
+
# run files directly if requested
|
|
109
|
+
if args.direct:
|
|
35
110
|
from psychopy import core
|
|
36
111
|
import os
|
|
37
|
-
|
|
112
|
+
# make sure there's a file to run
|
|
113
|
+
assert startFiles, (
|
|
114
|
+
"Argument -x was used to directly run a script or experiment, but no script or "
|
|
115
|
+
"experiment path was given."
|
|
116
|
+
)
|
|
117
|
+
# run all .py scripts from the command line using StandAlone python
|
|
118
|
+
for targetScript in startFiles:
|
|
119
|
+
# skip non-runnable files
|
|
120
|
+
if targetScript.suffix not in (".psyexp", ".py"):
|
|
121
|
+
print(
|
|
122
|
+
"Could not run file '{}' as it is not a Python script or PsychoPy experiment."
|
|
123
|
+
.format(targetScript)
|
|
124
|
+
)
|
|
125
|
+
continue
|
|
126
|
+
# compile Python code if given a psyexp
|
|
127
|
+
if targetScript.suffix == ".psyexp":
|
|
128
|
+
from psychopy import experiment
|
|
129
|
+
exp = experiment.Experiment.fromFile(targetScript)
|
|
130
|
+
script = exp.writeScript()
|
|
131
|
+
targetScript = targetScript.parent / (targetScript.stem + ".py")
|
|
132
|
+
targetScript.write_text(script, encoding="utf-8")
|
|
133
|
+
# run file
|
|
134
|
+
stderr = core.shellCall([sys.executable, targetScript.absolute()], stderr=True)
|
|
135
|
+
for line in stderr:
|
|
136
|
+
print(line)
|
|
38
137
|
sys.exit()
|
|
138
|
+
# print version info if requested
|
|
39
139
|
if '-v' in sys.argv or '--version' in sys.argv:
|
|
40
140
|
from psychopy import __version__
|
|
41
141
|
msg = ('PsychoPy3, version %s (c)Jonathan Peirce 2018, GNU GPL license'
|
|
42
142
|
% __version__)
|
|
43
143
|
print(msg)
|
|
44
144
|
sys.exit()
|
|
45
|
-
if '-h' in sys.argv or '--help' in sys.argv:
|
|
46
|
-
print("""Starts the PsychoPy3 application.
|
|
47
|
-
|
|
48
|
-
Usage: python PsychoPy.py [options] [file]
|
|
49
|
-
|
|
50
|
-
Without options or files provided this starts PsychoPy using prefs to
|
|
51
|
-
decide on the view(s) to open. If optional [file] is provided action
|
|
52
|
-
depends on the type of the [file]:
|
|
53
|
-
|
|
54
|
-
Python script 'file.py' -- opens coder
|
|
55
|
-
|
|
56
|
-
Experiment design 'file.psyexp' -- opens builder
|
|
57
|
-
|
|
58
|
-
Options:
|
|
59
|
-
-c, --coder, coder opens coder view only
|
|
60
|
-
-b, --builder, builder opens builder view only
|
|
61
|
-
-x script.py execute script.py using StandAlone python
|
|
62
|
-
|
|
63
|
-
-v, --version prints version and exits
|
|
64
|
-
-h, --help prints this help and exit
|
|
65
|
-
|
|
66
|
-
--firstrun launches configuration wizard
|
|
67
|
-
--no-splash suppresses splash screen
|
|
68
|
-
|
|
69
|
-
""")
|
|
70
|
-
sys.exit()
|
|
71
145
|
|
|
72
146
|
if (sys.platform == 'darwin' and
|
|
73
147
|
('| packaged by conda-forge |' in sys.version or
|
|
@@ -89,9 +163,7 @@ Options:
|
|
|
89
163
|
# Therefore `pythonw` often doesn't exist, and we can just use `python`.
|
|
90
164
|
if PYTHONW != 'True' and os.path.isfile(pyw_exe):
|
|
91
165
|
from psychopy import core
|
|
92
|
-
cmd = [pyw_exe
|
|
93
|
-
if '--no-splash' in sys.argv:
|
|
94
|
-
cmd.append('--no-splash')
|
|
166
|
+
cmd = [pyw_exe] + sys.argv
|
|
95
167
|
|
|
96
168
|
stdout, stderr = core.shellCall(cmd,
|
|
97
169
|
env=dict(env, PYTHONW='True'),
|
|
@@ -100,9 +172,23 @@ Options:
|
|
|
100
172
|
print(stderr, file=sys.stderr)
|
|
101
173
|
sys.exit()
|
|
102
174
|
else:
|
|
103
|
-
|
|
175
|
+
startApp(
|
|
176
|
+
startView=args.startView,
|
|
177
|
+
showSplash=args.showSplash,
|
|
178
|
+
startFiles=startFiles,
|
|
179
|
+
firstRun=args.firstRun,
|
|
180
|
+
profiling=args.profiling
|
|
181
|
+
)
|
|
104
182
|
else:
|
|
105
|
-
|
|
183
|
+
# start app
|
|
184
|
+
_ = startApp(
|
|
185
|
+
startView=args.startView,
|
|
186
|
+
showSplash=args.showSplash,
|
|
187
|
+
startFiles=startFiles,
|
|
188
|
+
firstRun=args.firstRun,
|
|
189
|
+
profiling=args.profiling
|
|
190
|
+
)
|
|
191
|
+
quitApp()
|
|
106
192
|
|
|
107
193
|
|
|
108
194
|
if __name__ == '__main__':
|
psychopy/app/ribbon.py
CHANGED
|
@@ -412,6 +412,7 @@ class FrameRibbonSection(wx.Panel, handlers.ThemeMixin):
|
|
|
412
412
|
# set color
|
|
413
413
|
self.SetBackgroundColour(colors.app['frame_bg'])
|
|
414
414
|
self.SetForegroundColour(colors.app['text'])
|
|
415
|
+
self.label.SetForegroundColour(colors.app['text'])
|
|
415
416
|
# set bitmaps again
|
|
416
417
|
self._icon.reload()
|
|
417
418
|
self.icon.SetBitmap(self._icon.bitmap)
|
psychopy/app/runner/runner.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
|
import glob
|
|
8
8
|
import json
|
|
@@ -24,7 +24,7 @@ import webbrowser
|
|
|
24
24
|
from pathlib import Path
|
|
25
25
|
from subprocess import Popen, PIPE
|
|
26
26
|
|
|
27
|
-
from psychopy import experiment, logging
|
|
27
|
+
from psychopy import experiment, logging, alerts
|
|
28
28
|
from psychopy.app.utils import FrameSwitcher, FileDropTarget
|
|
29
29
|
from psychopy.localization import _translate
|
|
30
30
|
from psychopy.projects.pavlovia import getProject
|
|
@@ -538,7 +538,7 @@ class RunnerPanel(wx.Panel, ScriptProcess, handlers.ThemeMixin):
|
|
|
538
538
|
self.splitter.SplitVertically(
|
|
539
539
|
window1=self.topPanel,
|
|
540
540
|
window2=self.bottomPanel,
|
|
541
|
-
sashPosition=
|
|
541
|
+
sashPosition=360
|
|
542
542
|
)
|
|
543
543
|
self.splitter.SetMinimumPaneSize(360)
|
|
544
544
|
|
|
@@ -693,7 +693,7 @@ class RunnerPanel(wx.Panel, ScriptProcess, handlers.ThemeMixin):
|
|
|
693
693
|
# start server
|
|
694
694
|
self.startServer(htmlPath, port=port)
|
|
695
695
|
# open experiment
|
|
696
|
-
webbrowser.open("http://localhost:{}".format(port))
|
|
696
|
+
webbrowser.open("http://localhost:{}?__pilotToken=local".format(port))
|
|
697
697
|
# log experiment open
|
|
698
698
|
print(
|
|
699
699
|
f"##### Running PsychoJS task from {htmlPath} on port {port} #####\n"
|
|
@@ -1050,7 +1050,12 @@ class RunnerPanel(wx.Panel, ScriptProcess, handlers.ThemeMixin):
|
|
|
1050
1050
|
|
|
1051
1051
|
class RunnerOutputNotebook(aui.AuiNotebook, handlers.ThemeMixin):
|
|
1052
1052
|
def __init__(self, parent):
|
|
1053
|
-
aui.AuiNotebook.__init__(
|
|
1053
|
+
aui.AuiNotebook.__init__(
|
|
1054
|
+
self,
|
|
1055
|
+
parent,
|
|
1056
|
+
style=wx.BORDER_NONE,
|
|
1057
|
+
agwStyle=aui.AUI_NB_CLOSE_ON_ALL_TABS
|
|
1058
|
+
)
|
|
1054
1059
|
|
|
1055
1060
|
# store pages by non-translated names for easy access (see RunnerFrame.getOutputPanel)
|
|
1056
1061
|
self.panels = {}
|
|
@@ -1065,6 +1070,7 @@ class RunnerOutputNotebook(aui.AuiNotebook, handlers.ThemeMixin):
|
|
|
1065
1070
|
self.alertsPnl, caption=_translate("Alerts")
|
|
1066
1071
|
)
|
|
1067
1072
|
self.panels['alerts'] = self.alertsPnl
|
|
1073
|
+
alerts.addAlertHandler(self.alertsPnl.ctrl)
|
|
1068
1074
|
|
|
1069
1075
|
# StdOut
|
|
1070
1076
|
self.stdoutPnl = ScriptOutputPanel(
|
|
@@ -1091,8 +1097,14 @@ class RunnerOutputNotebook(aui.AuiNotebook, handlers.ThemeMixin):
|
|
|
1091
1097
|
# bind function when page receives focus
|
|
1092
1098
|
self._readCache = {}
|
|
1093
1099
|
self.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.onFocus)
|
|
1094
|
-
|
|
1095
|
-
self.SetMinSize(wx.Size(
|
|
1100
|
+
# min size is 80 chars / 40 lines
|
|
1101
|
+
self.SetMinSize(wx.Size(
|
|
1102
|
+
self.stdoutPnl.GetCharWidth() * 80,
|
|
1103
|
+
self.stdoutPnl.GetCharHeight() * 40,
|
|
1104
|
+
))
|
|
1105
|
+
# hide close buttons on tabs
|
|
1106
|
+
for i in range(self.GetPageCount()):
|
|
1107
|
+
self.SetCloseButton(i, False)
|
|
1096
1108
|
|
|
1097
1109
|
def setRead(self, i, state):
|
|
1098
1110
|
"""
|
|
@@ -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
|
"""Utilities for running scripts from the PsychoPy application suite.
|
|
@@ -297,11 +297,16 @@ class ScriptProcess:
|
|
|
297
297
|
Program exit code.
|
|
298
298
|
|
|
299
299
|
"""
|
|
300
|
-
# write a close message, shows the exit code
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
300
|
+
# write a close message, shows the exit code if there is one
|
|
301
|
+
if exitCode:
|
|
302
|
+
closeMsg = (
|
|
303
|
+
" Experiment ended with exit code {ec} [pid:{pid}] "
|
|
304
|
+
)
|
|
305
|
+
else:
|
|
306
|
+
closeMsg = (
|
|
307
|
+
" Experiment completed [pid:{pid}] "
|
|
308
|
+
)
|
|
309
|
+
closeMsg = closeMsg.format(ec=exitCode, pid=pid).center(64, '#') + '\n'
|
|
305
310
|
self._writeOutput(closeMsg)
|
|
306
311
|
|
|
307
312
|
self.scriptProcess = None # reset
|
|
@@ -7,7 +7,7 @@ import re
|
|
|
7
7
|
import wx.richtext
|
|
8
8
|
import locale
|
|
9
9
|
|
|
10
|
-
from psychopy import prefs
|
|
10
|
+
from psychopy import prefs, alerts
|
|
11
11
|
from psychopy.localization import _translate
|
|
12
12
|
from psychopy.app.utils import sanitize
|
|
13
13
|
#!/usr/bin/env python
|
|
@@ -16,7 +16,7 @@ from psychopy.app.utils import sanitize
|
|
|
16
16
|
"""Classes and functions for the script output."""
|
|
17
17
|
|
|
18
18
|
# Part of the PsychoPy library
|
|
19
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
19
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
20
20
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
21
21
|
|
|
22
22
|
import re
|
|
@@ -390,6 +390,13 @@ class ScriptOutputCtrl(StdOutRich, handlers.ThemeMixin):
|
|
|
390
390
|
|
|
391
391
|
self.errors = []
|
|
392
392
|
self.alerts = []
|
|
393
|
+
|
|
394
|
+
def __del__(self):
|
|
395
|
+
"""
|
|
396
|
+
If setup as an alert handler, remove self on deletion.
|
|
397
|
+
"""
|
|
398
|
+
if alerts.isAlertHandler(self):
|
|
399
|
+
alerts.removeAlertHandler(self)
|
|
393
400
|
|
|
394
401
|
|
|
395
402
|
if __name__ == "__main__":
|
psychopy/app/themes/fonts.py
CHANGED
|
@@ -568,7 +568,7 @@ def extractFaceNames(val):
|
|
|
568
568
|
# Make sure val is a list
|
|
569
569
|
if isinstance(val, str):
|
|
570
570
|
# Get rid of any perentheses
|
|
571
|
-
val = re.sub("[\(\)\[\]]", "", val)
|
|
571
|
+
val = re.sub(r"[\(\)\[\]]", "", val)
|
|
572
572
|
# Split by comma
|
|
573
573
|
val = val.split(",")
|
|
574
574
|
# Clear style markers
|