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.

Files changed (903) hide show
  1. psychopy/CHANGELOG.txt +208 -4
  2. psychopy/LICENSE.txt +1 -1
  3. psychopy/VERSION +1 -1
  4. psychopy/__init__.py +10 -7
  5. psychopy/alerts/__init__.py +1 -1
  6. psychopy/alerts/_alerts.py +53 -17
  7. psychopy/alerts/_errorHandler.py +3 -4
  8. psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
  9. psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
  10. psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
  11. psychopy/alerts/alertsCatalogue/alertCategories.yaml +8 -1
  12. psychopy/alerts/alertsCatalogue/alertmsg.py +1 -1
  13. psychopy/alerts/alerttools.py +0 -16
  14. psychopy/app/Resources/betasplash.png +0 -0
  15. psychopy/app/Resources/betasplash@2x.png +0 -0
  16. psychopy/app/Resources/classic/case.png +0 -0
  17. psychopy/app/Resources/classic/case@2x.png +0 -0
  18. psychopy/app/Resources/classic/fileaudio.png +0 -0
  19. psychopy/app/Resources/classic/fileaudio@2x.png +0 -0
  20. psychopy/app/Resources/classic/filecss.png +0 -0
  21. psychopy/app/Resources/classic/filecss@2x.png +0 -0
  22. psychopy/app/Resources/classic/filecsv.png +0 -0
  23. psychopy/app/Resources/classic/filecsv@2x.png +0 -0
  24. psychopy/app/Resources/classic/filedesign.png +0 -0
  25. psychopy/app/Resources/classic/filedesign@2x.png +0 -0
  26. psychopy/app/Resources/classic/filefont.png +0 -0
  27. psychopy/app/Resources/classic/filefont@2x.png +0 -0
  28. psychopy/app/Resources/classic/filegit.png +0 -0
  29. psychopy/app/Resources/classic/filegit@2x.png +0 -0
  30. psychopy/app/Resources/classic/filehtml.png +0 -0
  31. psychopy/app/Resources/classic/filehtml@2x.png +0 -0
  32. psychopy/app/Resources/classic/fileimage.png +0 -0
  33. psychopy/app/Resources/classic/fileimage@2x.png +0 -0
  34. psychopy/app/Resources/classic/fileinfo.png +0 -0
  35. psychopy/app/Resources/classic/fileinfo@2x.png +0 -0
  36. psychopy/app/Resources/classic/filejs.png +0 -0
  37. psychopy/app/Resources/classic/filejs@2x.png +0 -0
  38. psychopy/app/Resources/classic/filejson.png +0 -0
  39. psychopy/app/Resources/classic/filejson@2x.png +0 -0
  40. psychopy/app/Resources/classic/filepkg.png +0 -0
  41. psychopy/app/Resources/classic/filepkg@2x.png +0 -0
  42. psychopy/app/Resources/classic/filepsyexp.png +0 -0
  43. psychopy/app/Resources/classic/filepsyexp@2x.png +0 -0
  44. psychopy/app/Resources/classic/filepy.png +0 -0
  45. psychopy/app/Resources/classic/filepy@2x.png +0 -0
  46. psychopy/app/Resources/classic/filetxt.png +0 -0
  47. psychopy/app/Resources/classic/filetxt@2x.png +0 -0
  48. psychopy/app/Resources/classic/fileunknown.png +0 -0
  49. psychopy/app/Resources/classic/fileunknown@2x.png +0 -0
  50. psychopy/app/Resources/classic/filevideo.png +0 -0
  51. psychopy/app/Resources/classic/filevideo@2x.png +0 -0
  52. psychopy/app/Resources/classic/find.png +0 -0
  53. psychopy/app/Resources/classic/find@2x.png +0 -0
  54. psychopy/app/Resources/classic/loop.png +0 -0
  55. psychopy/app/Resources/classic/loop@2x.png +0 -0
  56. psychopy/app/Resources/classic/regex.png +0 -0
  57. psychopy/app/Resources/classic/regex@2x.png +0 -0
  58. psychopy/app/Resources/dark/case.png +0 -0
  59. psychopy/app/Resources/dark/case@2x.png +0 -0
  60. psychopy/app/Resources/dark/fileaudio.png +0 -0
  61. psychopy/app/Resources/dark/fileaudio@2x.png +0 -0
  62. psychopy/app/Resources/dark/filecss.png +0 -0
  63. psychopy/app/Resources/dark/filecss@2x.png +0 -0
  64. psychopy/app/Resources/dark/filecsv.png +0 -0
  65. psychopy/app/Resources/dark/filecsv@2x.png +0 -0
  66. psychopy/app/Resources/dark/filedesign.png +0 -0
  67. psychopy/app/Resources/dark/filedesign@2x.png +0 -0
  68. psychopy/app/Resources/dark/filefont.png +0 -0
  69. psychopy/app/Resources/dark/filefont@2x.png +0 -0
  70. psychopy/app/Resources/dark/filegit.png +0 -0
  71. psychopy/app/Resources/dark/filegit@2x.png +0 -0
  72. psychopy/app/Resources/dark/filehtml.png +0 -0
  73. psychopy/app/Resources/dark/filehtml@2x.png +0 -0
  74. psychopy/app/Resources/dark/fileimage.png +0 -0
  75. psychopy/app/Resources/dark/fileimage@2x.png +0 -0
  76. psychopy/app/Resources/dark/fileinfo.png +0 -0
  77. psychopy/app/Resources/dark/fileinfo@2x.png +0 -0
  78. psychopy/app/Resources/dark/filejs.png +0 -0
  79. psychopy/app/Resources/dark/filejs@2x.png +0 -0
  80. psychopy/app/Resources/dark/filejson.png +0 -0
  81. psychopy/app/Resources/dark/filejson@2x.png +0 -0
  82. psychopy/app/Resources/dark/filepkg.png +0 -0
  83. psychopy/app/Resources/dark/filepkg@2x.png +0 -0
  84. psychopy/app/Resources/dark/filepsyexp.png +0 -0
  85. psychopy/app/Resources/dark/filepsyexp@2x.png +0 -0
  86. psychopy/app/Resources/dark/filepy.png +0 -0
  87. psychopy/app/Resources/dark/filepy@2x.png +0 -0
  88. psychopy/app/Resources/dark/filetxt.png +0 -0
  89. psychopy/app/Resources/dark/filetxt@2x.png +0 -0
  90. psychopy/app/Resources/dark/fileunknown.png +0 -0
  91. psychopy/app/Resources/dark/fileunknown@2x.png +0 -0
  92. psychopy/app/Resources/dark/filevideo.png +0 -0
  93. psychopy/app/Resources/dark/filevideo@2x.png +0 -0
  94. psychopy/app/Resources/dark/find.png +0 -0
  95. psychopy/app/Resources/dark/find@2x.png +0 -0
  96. psychopy/app/Resources/dark/loop.png +0 -0
  97. psychopy/app/Resources/dark/loop@2x.png +0 -0
  98. psychopy/app/Resources/dark/regex.png +0 -0
  99. psychopy/app/Resources/dark/regex@2x.png +0 -0
  100. psychopy/app/Resources/light/case.png +0 -0
  101. psychopy/app/Resources/light/case@2x.png +0 -0
  102. psychopy/app/Resources/light/fileaudio.png +0 -0
  103. psychopy/app/Resources/light/fileaudio@2x.png +0 -0
  104. psychopy/app/Resources/light/filecss.png +0 -0
  105. psychopy/app/Resources/light/filecss@2x.png +0 -0
  106. psychopy/app/Resources/light/filecsv.png +0 -0
  107. psychopy/app/Resources/light/filecsv@2x.png +0 -0
  108. psychopy/app/Resources/light/filedesign.png +0 -0
  109. psychopy/app/Resources/light/filedesign@2x.png +0 -0
  110. psychopy/app/Resources/light/filefont.png +0 -0
  111. psychopy/app/Resources/light/filefont@2x.png +0 -0
  112. psychopy/app/Resources/light/filegit.png +0 -0
  113. psychopy/app/Resources/light/filegit@2x.png +0 -0
  114. psychopy/app/Resources/light/filehtml.png +0 -0
  115. psychopy/app/Resources/light/filehtml@2x.png +0 -0
  116. psychopy/app/Resources/light/fileimage.png +0 -0
  117. psychopy/app/Resources/light/fileimage@2x.png +0 -0
  118. psychopy/app/Resources/light/fileinfo.png +0 -0
  119. psychopy/app/Resources/light/fileinfo@2x.png +0 -0
  120. psychopy/app/Resources/light/filejs.png +0 -0
  121. psychopy/app/Resources/light/filejs@2x.png +0 -0
  122. psychopy/app/Resources/light/filejson.png +0 -0
  123. psychopy/app/Resources/light/filejson@2x.png +0 -0
  124. psychopy/app/Resources/light/filepkg.png +0 -0
  125. psychopy/app/Resources/light/filepkg@2x.png +0 -0
  126. psychopy/app/Resources/light/filepsyexp.png +0 -0
  127. psychopy/app/Resources/light/filepsyexp@2x.png +0 -0
  128. psychopy/app/Resources/light/filepy.png +0 -0
  129. psychopy/app/Resources/light/filepy@2x.png +0 -0
  130. psychopy/app/Resources/light/filetxt.png +0 -0
  131. psychopy/app/Resources/light/filetxt@2x.png +0 -0
  132. psychopy/app/Resources/light/fileunknown.png +0 -0
  133. psychopy/app/Resources/light/fileunknown@2x.png +0 -0
  134. psychopy/app/Resources/light/filevideo.png +0 -0
  135. psychopy/app/Resources/light/filevideo@2x.png +0 -0
  136. psychopy/app/Resources/light/find.png +0 -0
  137. psychopy/app/Resources/light/find@2x.png +0 -0
  138. psychopy/app/Resources/light/loop.png +0 -0
  139. psychopy/app/Resources/light/loop@2x.png +0 -0
  140. psychopy/app/Resources/light/regex.png +0 -0
  141. psychopy/app/Resources/light/regex@2x.png +0 -0
  142. psychopy/app/Resources/routine_templates/Basic.psyexp +0 -1
  143. psychopy/app/Resources/routine_templates/Misc.psyexp +0 -1
  144. psychopy/app/Resources/routine_templates/Online.psyexp +0 -2
  145. psychopy/app/Resources/routine_templates/Trials.psyexp +0 -1
  146. psychopy/app/Resources/splash.png +0 -0
  147. psychopy/app/Resources/splash@2x.png +0 -0
  148. psychopy/app/__init__.py +49 -8
  149. psychopy/app/__main__.py +3 -0
  150. psychopy/app/_psychopyApp.py +134 -125
  151. psychopy/app/builder/builder.py +42 -22
  152. psychopy/app/builder/dialogs/__init__.py +44 -11
  153. psychopy/app/builder/dialogs/dlgsCode.py +1 -1
  154. psychopy/app/builder/dialogs/dlgsConditions.py +1 -1
  155. psychopy/app/builder/dialogs/findDlg.py +106 -20
  156. psychopy/app/builder/dialogs/paramCtrls.py +42 -1
  157. psychopy/app/builder/validators.py +1 -1
  158. psychopy/app/coder/codeEditorBase.py +8 -8
  159. psychopy/app/coder/coder.py +32 -29
  160. psychopy/app/coder/fileBrowser.py +68 -22
  161. psychopy/app/coder/folding.py +1 -1
  162. psychopy/app/coder/psychoParser.py +1 -1
  163. psychopy/app/coder/repl.py +1 -1
  164. psychopy/app/coder/sourceTree.py +1 -1
  165. psychopy/app/connections/__init__.py +1 -1
  166. psychopy/app/connections/news.py +1 -1
  167. psychopy/app/connections/sendusage.py +1 -1
  168. psychopy/app/connections/updates.py +1 -1
  169. psychopy/app/console.py +1 -1
  170. psychopy/app/errorDlg.py +1 -1
  171. psychopy/app/frametracker.py +1 -1
  172. psychopy/app/idle.py +1 -1
  173. psychopy/app/jobs.py +5 -2
  174. psychopy/app/linuxconfig/__init__.py +1 -1
  175. psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
  176. psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +1514 -3259
  177. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
  178. psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
  179. psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
  180. psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +3 -3
  181. psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
  182. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
  183. psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
  184. psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
  185. psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +4 -4
  186. psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
  187. psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +4 -4
  188. psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
  189. psychopy/app/locale/es_US/LC_MESSAGE/messages.po +4 -4
  190. psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
  191. psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +2 -2
  192. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
  193. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +1 -1
  194. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
  195. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
  196. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +2 -2
  197. psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
  198. psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +2 -2
  199. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
  200. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +2 -2
  201. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
  202. psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
  203. psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +2 -2
  204. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
  205. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +3421 -2396
  206. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
  207. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
  208. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +2 -2
  209. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
  210. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
  211. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
  212. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
  213. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +4 -4
  214. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
  215. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
  216. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
  217. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +2 -2
  218. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
  219. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +2 -2
  220. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
  221. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +3 -3
  222. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
  223. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +2 -2
  224. psychopy/app/{builder/localizedStrings.py → localizedStrings.py} +173 -26
  225. psychopy/app/pavlovia_ui/__init__.py +1 -1
  226. psychopy/app/pavlovia_ui/_base.py +1 -1
  227. psychopy/app/pavlovia_ui/functions.py +1 -1
  228. psychopy/app/pavlovia_ui/menu.py +1 -1
  229. psychopy/app/pavlovia_ui/project.py +1 -1
  230. psychopy/app/pavlovia_ui/search.py +1 -1
  231. psychopy/app/pavlovia_ui/sync.py +1 -1
  232. psychopy/app/pavlovia_ui/user.py +1 -1
  233. psychopy/app/plugin_manager/dialog.py +34 -96
  234. psychopy/app/plugin_manager/packages.py +10 -14
  235. psychopy/app/plugin_manager/plugins.py +64 -4
  236. psychopy/app/preferencesDlg.py +12 -37
  237. psychopy/app/psychopyApp.py +130 -44
  238. psychopy/app/ribbon.py +1 -0
  239. psychopy/app/runner/runner.py +37 -15
  240. psychopy/app/runner/scriptProcess.py +11 -6
  241. psychopy/app/stdout/stdOutRich.py +9 -2
  242. psychopy/app/themes/fonts.py +1 -1
  243. psychopy/app/themes/icons.py +2 -38
  244. psychopy/app/ui/__init__.py +1 -1
  245. psychopy/app/utils.py +3 -3
  246. psychopy/assets/default.mp3 +0 -0
  247. psychopy/assets/fonts/NotoSans-Bold.ttf +0 -0
  248. psychopy/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
  249. psychopy/assets/fonts/NotoSans-Italic.ttf +0 -0
  250. psychopy/assets/fonts/NotoSans-Regular.ttf +0 -0
  251. psychopy/assets/voicekeyThresholdStim.wav +0 -0
  252. psychopy/clock.py +4 -1
  253. psychopy/colors.py +2 -0
  254. psychopy/core.py +1 -1
  255. psychopy/data/base.py +1 -1
  256. psychopy/data/experiment.py +151 -46
  257. psychopy/data/routine.py +27 -1
  258. psychopy/data/staircase.py +2 -1
  259. psychopy/data/trial.py +62 -14
  260. psychopy/data/utils.py +1 -1
  261. psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +333 -218
  262. psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +261 -239
  263. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +319 -180
  264. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +204 -116
  265. psychopy/demos/builder/Experiments/BART/assets/background.jpg +0 -0
  266. psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
  267. psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
  268. psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
  269. psychopy/demos/builder/Experiments/BART/bart.psyexp +779 -866
  270. psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +242 -180
  271. psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +419 -406
  272. psychopy/demos/builder/Experiments/dragAndDrop/README.md +2 -37
  273. psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +460 -1204
  274. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/blank_grid.png +0 -0
  275. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/make_shapes.psyexp +221 -0
  276. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/readme.md +4 -0
  277. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_1.png +0 -0
  278. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_10.png +0 -0
  279. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_2.png +0 -0
  280. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_3.png +0 -0
  281. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_4.png +0 -0
  282. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_5.png +0 -0
  283. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_6.png +0 -0
  284. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_7.png +0 -0
  285. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_8.png +0 -0
  286. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_9.png +0 -0
  287. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
  288. psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +583 -542
  289. psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +458 -427
  290. psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +588 -550
  291. psychopy/demos/builder/Experiments/stroop/stroop.psyexp +303 -207
  292. psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +390 -215
  293. psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +390 -215
  294. psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +357 -331
  295. psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +3 -2
  296. psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +287 -277
  297. psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +370 -320
  298. psychopy/demos/builder/Feature Demos/noise/noise.psyexp +452 -399
  299. psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +168 -133
  300. psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +4 -3
  301. psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +420 -392
  302. psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +917 -871
  303. psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
  304. psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +200 -0
  305. psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +25 -9
  306. psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +372 -361
  307. psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +25 -9
  308. psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +320 -235
  309. psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +790 -651
  310. psychopy/demos/builder/Hardware/camera/camera.psyexp +326 -246
  311. psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +432 -327
  312. psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +440 -321
  313. psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +190 -181
  314. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +323 -312
  315. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy.psyexp +360 -0
  316. psychopy/demos/builder/{Feature Demos/eyetracking/eyetracking.xml → Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp} +154 -140
  317. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +329 -273
  318. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy.psyexp +360 -0
  319. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy_legacy.psyexp +312 -0
  320. psychopy/demos/builder/Hardware/microphone/microphone.psyexp +450 -404
  321. psychopy/demos/builder/Hardware/pump/pump.psyexp +593 -329
  322. psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
  323. psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +336 -274
  324. psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +200 -149
  325. psychopy/demos/builder/Helper Tools/colors/colors.psyexp +300 -279
  326. psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +677 -564
  327. psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +214 -158
  328. psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +195 -146
  329. psychopy/demos/coder/experiment control/runtimeInfo.py +1 -1
  330. psychopy/devices/__init__.py +1 -1
  331. psychopy/event.py +1 -1
  332. psychopy/exceptions.py +1 -1
  333. psychopy/experiment/__init__.py +1 -1
  334. psychopy/experiment/_experiment.py +62 -16
  335. psychopy/experiment/components/__init__.py +1 -6
  336. psychopy/experiment/components/_base.py +44 -19
  337. psychopy/experiment/components/aperture/__init__.py +1 -1
  338. psychopy/experiment/components/brush/__init__.py +2 -2
  339. psychopy/experiment/components/button/__init__.py +24 -28
  340. psychopy/experiment/components/camera/__init__.py +38 -39
  341. psychopy/experiment/components/code/__init__.py +1 -1
  342. psychopy/experiment/components/dots/__init__.py +1 -1
  343. psychopy/experiment/components/eyetracker_record/__init__.py +7 -3
  344. psychopy/experiment/components/form/__init__.py +3 -3
  345. psychopy/experiment/components/grating/__init__.py +1 -1
  346. psychopy/experiment/components/image/__init__.py +1 -1
  347. psychopy/experiment/components/joyButtons/__init__.py +2 -2
  348. psychopy/experiment/components/joyButtons/virtualJoyButtons.py +1 -1
  349. psychopy/experiment/components/joystick/__init__.py +3 -3
  350. psychopy/experiment/components/joystick/virtualJoystick.py +1 -1
  351. psychopy/experiment/components/keyboard/__init__.py +98 -122
  352. psychopy/experiment/components/microphone/__init__.py +54 -98
  353. psychopy/experiment/components/mouse/__init__.py +92 -93
  354. psychopy/experiment/components/movie/__init__.py +28 -50
  355. psychopy/experiment/components/parallelOut/__init__.py +3 -3
  356. psychopy/experiment/components/polygon/__init__.py +2 -3
  357. psychopy/experiment/components/roi/__init__.py +2 -2
  358. psychopy/experiment/components/routineSettings/__init__.py +2 -0
  359. psychopy/experiment/components/serialOut/__init__.py +7 -7
  360. psychopy/experiment/components/settings/__init__.py +317 -313
  361. psychopy/experiment/components/settings/eyetracking.py +108 -0
  362. psychopy/experiment/components/slider/__init__.py +5 -5
  363. psychopy/experiment/components/sound/__init__.py +168 -78
  364. psychopy/experiment/components/soundsensor/__init__.py +361 -0
  365. psychopy/experiment/components/soundsensor/classic/soundsensor.png +0 -0
  366. psychopy/experiment/components/soundsensor/classic/soundsensor@2x.png +0 -0
  367. psychopy/experiment/components/soundsensor/dark/soundsensor.png +0 -0
  368. psychopy/experiment/components/soundsensor/dark/soundsensor@2x.png +0 -0
  369. psychopy/experiment/components/soundsensor/light/soundsensor.png +0 -0
  370. psychopy/experiment/components/soundsensor/light/soundsensor@2x.png +0 -0
  371. psychopy/experiment/components/static/__init__.py +59 -33
  372. psychopy/experiment/components/text/__init__.py +2 -6
  373. psychopy/experiment/components/textbox/__init__.py +3 -7
  374. psychopy/experiment/components/unknown/__init__.py +2 -0
  375. psychopy/experiment/components/unknownPlugin/__init__.py +2 -0
  376. psychopy/experiment/exports.py +1 -1
  377. psychopy/experiment/flow.py +2 -2
  378. psychopy/experiment/localization.py +1 -1
  379. psychopy/experiment/loops.py +43 -10
  380. psychopy/experiment/params.py +6 -4
  381. psychopy/experiment/plugins.py +8 -1
  382. psychopy/experiment/py2js.py +1 -1
  383. psychopy/experiment/py2js_transpiler.py +1 -1
  384. psychopy/experiment/routines/__init__.py +1 -1
  385. psychopy/experiment/routines/_base.py +23 -24
  386. psychopy/experiment/routines/audioValidator/__init__.py +343 -0
  387. psychopy/experiment/routines/audioValidator/classic/audio_validator.png +0 -0
  388. psychopy/experiment/routines/audioValidator/classic/audio_validator@2x.png +0 -0
  389. psychopy/experiment/routines/audioValidator/dark/audio_validator.png +0 -0
  390. psychopy/experiment/routines/audioValidator/dark/audio_validator@2x.png +0 -0
  391. psychopy/experiment/routines/audioValidator/light/audio_validator.png +0 -0
  392. psychopy/experiment/routines/audioValidator/light/audio_validator@2x.png +0 -0
  393. psychopy/experiment/routines/eyetracker_calibrate/__init__.py +76 -17
  394. psychopy/experiment/routines/eyetracker_validate/__init__.py +1 -1
  395. psychopy/experiment/routines/unknown/__init__.py +2 -0
  396. psychopy/experiment/routines/{photodiodeValidator → visualValidator}/__init__.py +89 -120
  397. psychopy/experiment/routines/visualValidator/classic/visual_validator.png +0 -0
  398. psychopy/experiment/routines/visualValidator/classic/visual_validator@2x.png +0 -0
  399. psychopy/experiment/routines/visualValidator/dark/visual_validator.png +0 -0
  400. psychopy/experiment/routines/visualValidator/dark/visual_validator@2x.png +0 -0
  401. psychopy/experiment/routines/visualValidator/light/visual_validator.png +0 -0
  402. psychopy/experiment/routines/visualValidator/light/visual_validator@2x.png +0 -0
  403. psychopy/experiment/utils.py +1 -1
  404. psychopy/gui/__init__.py +1 -1
  405. psychopy/gui/qtgui.py +15 -6
  406. psychopy/gui/wxgui.py +1 -1
  407. psychopy/hardware/__init__.py +0 -1
  408. psychopy/hardware/base.py +147 -16
  409. psychopy/hardware/bbtk/__init__.py +10 -16
  410. psychopy/hardware/brainproducts.py +7 -13
  411. psychopy/hardware/button.py +21 -2
  412. psychopy/hardware/buttonbox/__init__.py +1 -1
  413. psychopy/hardware/camera/__init__.py +16 -3
  414. psychopy/hardware/cedrus.py +5 -16
  415. psychopy/hardware/crs/__init__.py +1 -1
  416. psychopy/hardware/crs/bits.py +36 -33
  417. psychopy/hardware/crs/colorcal.py +8 -11
  418. psychopy/hardware/crs/optical.py +7 -10
  419. psychopy/hardware/crs/shaders.py +18 -5
  420. psychopy/hardware/emotiv.py +1 -1
  421. psychopy/hardware/emulator.py +11 -5
  422. psychopy/hardware/exceptions.py +86 -0
  423. psychopy/hardware/forp.py +18 -23
  424. psychopy/hardware/gammasci.py +8 -3
  425. psychopy/hardware/iolab.py +8 -19
  426. psychopy/hardware/joystick/__init__.py +865 -266
  427. psychopy/hardware/joystick/_base.py +251 -0
  428. psychopy/hardware/joystick/backend_glfw.py +306 -0
  429. psychopy/hardware/joystick/backend_pyglet.py +309 -0
  430. psychopy/hardware/joystick/mappings.py +287 -0
  431. psychopy/hardware/keyboard.py +4 -2
  432. psychopy/hardware/labhackers.py +1 -1
  433. psychopy/hardware/labjacks.py +9 -13
  434. psychopy/hardware/{photodiode.py → lightsensor.py} +146 -203
  435. psychopy/hardware/listener.py +9 -8
  436. psychopy/hardware/manager.py +24 -35
  437. psychopy/hardware/microphone.py +534 -154
  438. psychopy/hardware/minolta.py +14 -4
  439. psychopy/hardware/mouse/__init__.py +1 -1
  440. psychopy/hardware/photometer/__init__.py +2 -2
  441. psychopy/hardware/pr.py +14 -4
  442. psychopy/hardware/qmix.py +18 -27
  443. psychopy/hardware/serialdevice.py +43 -12
  444. psychopy/hardware/soundsensor.py +473 -0
  445. psychopy/hardware/spatial/__init__.py +231 -0
  446. psychopy/hardware/speaker.py +298 -36
  447. psychopy/hardware/triggerbox/__init__.py +1 -1
  448. psychopy/hardware/triggerbox/base.py +1 -1
  449. psychopy/hardware/triggerbox/parallel.py +1 -1
  450. psychopy/info.py +1 -1
  451. psychopy/iohub/client/__init__.py +17 -0
  452. psychopy/iohub/client/keyboard.py +5 -0
  453. psychopy/iohub/devices/eyetracker/__init__.py +10 -18
  454. psychopy/iohub/devices/eyetracker/calibration/procedure.py +15 -33
  455. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +1 -0
  456. psychopy/iohub/devices/mouse/linux2.py +6 -1
  457. psychopy/iohub/devices/mouse/win32.py +5 -0
  458. psychopy/layout.py +1 -1
  459. psychopy/liaison.py +91 -39
  460. psychopy/locale_setup.py +11 -1
  461. psychopy/localization/__init__.py +1 -1
  462. psychopy/localization/_localization.py +1 -1
  463. psychopy/localization/messages.pot +2 -2
  464. psychopy/logging.py +14 -12
  465. psychopy/microphone.py +4 -3
  466. psychopy/misc.py +1 -1
  467. psychopy/monitors/MonitorCenter.py +3 -3
  468. psychopy/monitors/__init__.py +1 -1
  469. psychopy/monitors/calibData.py +1 -1
  470. psychopy/monitors/calibTools.py +3 -2
  471. psychopy/platform_specific/__init__.py +1 -1
  472. psychopy/platform_specific/darwin.py +1 -1
  473. psychopy/platform_specific/linux.py +1 -1
  474. psychopy/platform_specific/win32.py +1 -1
  475. psychopy/plugins/__init__.py +26 -17
  476. psychopy/plugins/util.py +65 -0
  477. psychopy/preferences/Darwin.spec +11 -3
  478. psychopy/preferences/FreeBSD.spec +11 -3
  479. psychopy/preferences/Linux.spec +11 -3
  480. psychopy/preferences/Windows.spec +11 -3
  481. psychopy/preferences/__init__.py +1 -1
  482. psychopy/preferences/baseNoArch.spec +11 -3
  483. psychopy/preferences/hints.py +78 -61
  484. psychopy/preferences/preferences.py +82 -13
  485. psychopy/projects/__init__.py +1 -1
  486. psychopy/projects/pavlovia.py +29 -13
  487. psychopy/scripts/psyexpCompile.py +1 -1
  488. psychopy/session.py +81 -8
  489. psychopy/sound/__init__.py +25 -10
  490. psychopy/sound/_base.py +134 -34
  491. psychopy/sound/audioclip.py +38 -15
  492. psychopy/sound/audiodevice.py +1 -1
  493. psychopy/sound/backend_ptb.py +53 -321
  494. psychopy/sound/backend_pygame.py +7 -3
  495. psychopy/sound/backend_pyo.py +53 -22
  496. psychopy/sound/backend_pysound.py +10 -27
  497. psychopy/sound/backend_sounddevice.py +33 -21
  498. psychopy/sound/exceptions.py +1 -1
  499. psychopy/sound/microphone.py +83 -5
  500. psychopy/sound/transcribe.py +3 -3
  501. psychopy/tests/data/test_basic_run.py +1 -0
  502. psychopy/tests/data/test_loaded_namespace/test_counterbalance.psyexp +142 -0
  503. psychopy/tests/data/test_loaded_namespace/test_custom_missing.psyexp +129 -0
  504. psychopy/tests/data/test_loaded_namespace/test_missing_counterbalance.psyexp +116 -0
  505. psychopy/tests/data/test_loaded_namespace/test_mix_exp.psyexp +181 -0
  506. psychopy/tests/data/test_loaded_namespace/test_mix_missing.psyexp +140 -0
  507. psychopy/tests/data/test_loaded_namespace/test_mix_name_calibration.psyexp +164 -0
  508. psychopy/tests/data/test_sounds/default_16000.wav +0 -0
  509. psychopy/tests/data/test_sounds/default_192000.wav +0 -0
  510. psychopy/tests/data/test_sounds/default_22050.wav +0 -0
  511. psychopy/tests/data/test_sounds/default_32000.wav +0 -0
  512. psychopy/tests/data/test_sounds/default_44100.wav +0 -0
  513. psychopy/tests/data/test_sounds/default_48000.wav +0 -0
  514. psychopy/tests/data/test_sounds/default_8000.wav +0 -0
  515. psychopy/tests/data/test_sounds/default_96000.wav +0 -0
  516. psychopy/tests/test_alerts/test_alerttools.py +2 -1
  517. psychopy/tests/test_app/test_command_line.py +65 -0
  518. psychopy/tests/test_data/test_TrialHandler2.py +18 -7
  519. psychopy/tests/test_demos/test_builder_demos.py +1 -1
  520. psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +5238 -4188
  521. psychopy/tests/test_experiment/needs_wx/test_components.py +1 -1
  522. psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
  523. psychopy/tests/test_experiment/test_components/test_all_components.py +1 -1
  524. psychopy/tests/test_experiment/test_components/test_base_components.py +26 -17
  525. psychopy/tests/test_experiment/test_experiment.py +96 -0
  526. psychopy/tests/test_experiment/test_loops.py +12 -4
  527. psychopy/tests/test_experiment/test_params.py +17 -4
  528. psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +2 -2
  529. psychopy/tests/test_hardware/test_photodiode.py +66 -0
  530. psychopy/tests/test_liaison/test_Liaison.py +4 -4
  531. psychopy/tests/test_misc/test_clock.py +2 -0
  532. psychopy/tests/test_misc/test_color.py +2 -0
  533. psychopy/tests/test_misc/test_event.py +1 -0
  534. psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
  535. psychopy/tests/test_sound/test_sound.py +111 -40
  536. psychopy/tests/test_tools/test_colorspacetools.py +24 -23
  537. psychopy/tests/test_tools/test_mathtools.py +9 -9
  538. psychopy/tests/test_tools/test_viewtools.py +101 -0
  539. psychopy/tests/test_validators/__init__.py +0 -0
  540. psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
  541. psychopy/tests/test_visual/test_all_stimuli.py +2 -2
  542. psychopy/tests/test_visual/test_basevisual.py +37 -7
  543. psychopy/tests/test_visual/test_button.py +2 -2
  544. psychopy/tests/test_visual/test_circle.py +10 -2
  545. psychopy/tests/test_visual/test_dots.py +1 -1
  546. psychopy/tests/test_visual/test_form.py +13 -13
  547. psychopy/tests/test_visual/test_gamma.py +3 -3
  548. psychopy/tests/test_visual/test_image.py +2 -2
  549. psychopy/tests/test_visual/test_progress.py +2 -2
  550. psychopy/tests/test_visual/test_roi.py +8 -2
  551. psychopy/tests/test_visual/test_shape.py +2 -2
  552. psychopy/tests/test_visual/test_slider.py +2 -2
  553. psychopy/tests/test_visual/test_target.py +2 -2
  554. psychopy/tests/test_visual/test_textbox.py +6 -8
  555. psychopy/tests/test_visual/test_winScalePos.py +6 -5
  556. psychopy/tests/test_visual/test_window.py +17 -0
  557. psychopy/tests/utils.py +51 -1
  558. psychopy/tools/__init__.py +1 -1
  559. psychopy/tools/arraytools.py +2 -2
  560. psychopy/tools/attributetools.py +52 -1
  561. psychopy/tools/audiotools.py +4 -1
  562. psychopy/tools/colorspacetools.py +6 -4
  563. psychopy/tools/coordinatetools.py +1 -1
  564. psychopy/tools/fileerrortools.py +21 -9
  565. psychopy/tools/filetools.py +2 -2
  566. psychopy/tools/fontmanager.py +47 -28
  567. psychopy/tools/gltools.py +2964 -558
  568. psychopy/tools/imagetools.py +1 -1
  569. psychopy/tools/mathtools.py +997 -127
  570. psychopy/tools/monitorunittools.py +7 -1
  571. psychopy/tools/movietools.py +1 -2
  572. psychopy/tools/pkgtools.py +157 -127
  573. psychopy/tools/plottools.py +1 -1
  574. psychopy/tools/rifttools.py +1 -1
  575. psychopy/tools/stereotools.py +1 -1
  576. psychopy/tools/stimulustools.py +172 -2
  577. psychopy/tools/stringtools.py +22 -2
  578. psychopy/tools/systemtools.py +1 -1
  579. psychopy/tools/typetools.py +1 -1
  580. psychopy/tools/unittools.py +1 -1
  581. psychopy/tools/versionchooser.py +3 -1
  582. psychopy/tools/viewtools.py +54 -70
  583. psychopy/tools/wizard.py +2 -2
  584. psychopy/validation/__init__.py +6 -0
  585. psychopy/validation/audio.py +74 -0
  586. psychopy/validation/visual.py +115 -0
  587. psychopy/visual/__init__.py +1 -4
  588. psychopy/visual/aperture.py +9 -6
  589. psychopy/visual/backends/__init__.py +1 -1
  590. psychopy/visual/backends/_base.py +1 -1
  591. psychopy/visual/backends/gamma.py +1 -1
  592. psychopy/visual/backends/glfwbackend.py +8 -12
  593. psychopy/visual/backends/pygamebackend.py +1 -1
  594. psychopy/visual/backends/pygletbackend.py +32 -11
  595. psychopy/visual/basevisual.py +93 -13
  596. psychopy/visual/brush.py +1 -1
  597. psychopy/visual/bufferimage.py +90 -10
  598. psychopy/visual/button.py +1 -1
  599. psychopy/visual/circle.py +12 -20
  600. psychopy/visual/custommouse.py +1 -1
  601. psychopy/visual/dot.py +80 -14
  602. psychopy/visual/elementarray.py +84 -10
  603. psychopy/visual/filters.py +1 -1
  604. psychopy/visual/form.py +43 -28
  605. psychopy/visual/grating.py +105 -25
  606. psychopy/visual/helpers.py +1 -1
  607. psychopy/visual/image.py +98 -20
  608. psychopy/visual/line.py +15 -25
  609. psychopy/visual/movie.py +1 -1
  610. psychopy/visual/movie2.py +4 -3
  611. psychopy/visual/movie3.py +4 -3
  612. psychopy/visual/movies/__init__.py +1 -1
  613. psychopy/visual/movies/frame.py +1 -1
  614. psychopy/visual/movies/metadata.py +1 -1
  615. psychopy/visual/movies/players/__init__.py +1 -1
  616. psychopy/visual/movies/players/_base.py +1 -1
  617. psychopy/visual/movies/players/ffpyplayer_player.py +2 -3
  618. psychopy/visual/nnlvs.py +9 -6
  619. psychopy/visual/noise.py +4 -16
  620. psychopy/visual/patch.py +4 -3
  621. psychopy/visual/pie.py +3 -14
  622. psychopy/visual/polygon.py +21 -28
  623. psychopy/visual/radial.py +4 -18
  624. psychopy/visual/ratingscale.py +4 -3
  625. psychopy/visual/rect.py +16 -25
  626. psychopy/visual/rift.py +8 -2
  627. psychopy/visual/secondorder.py +4 -16
  628. psychopy/visual/shaders.py +620 -286
  629. psychopy/visual/shape.py +281 -90
  630. psychopy/visual/simpleimage.py +1 -1
  631. psychopy/visual/slider.py +78 -25
  632. psychopy/visual/stim3d.py +5 -608
  633. psychopy/visual/text.py +13 -3
  634. psychopy/visual/textbox2/textbox2.py +188 -56
  635. psychopy/visual/vlcmoviestim.py +1 -1
  636. psychopy/visual/window.py +373 -200
  637. psychopy/web.py +1 -1
  638. {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/METADATA +9 -9
  639. {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/RECORD +653 -660
  640. psychopy/.DS_Store +0 -0
  641. psychopy/__init__.py.orig +0 -65
  642. psychopy/app/.DS_Store +0 -0
  643. psychopy/app/Resources/.DS_Store +0 -0
  644. psychopy/app/Resources/classic/filecsv16.png +0 -0
  645. psychopy/app/Resources/classic/fileimage16.png +0 -0
  646. psychopy/app/Resources/classic/fileunknown16.png +0 -0
  647. psychopy/app/Resources/dark/filecsv16.png +0 -0
  648. psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
  649. psychopy/app/Resources/dark/fileimage16.png +0 -0
  650. psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
  651. psychopy/app/Resources/dark/fileunknown16.png +0 -0
  652. psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
  653. psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
  654. psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
  655. psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
  656. psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  657. psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
  658. psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
  659. psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
  660. psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
  661. psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
  662. psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
  663. psychopy/app/Resources/light/filecsv16.png +0 -0
  664. psychopy/app/Resources/light/filecsv16@2x.png +0 -0
  665. psychopy/app/Resources/light/fileimage16.png +0 -0
  666. psychopy/app/Resources/light/fileimage16@2x.png +0 -0
  667. psychopy/app/Resources/light/fileunknown16.png +0 -0
  668. psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
  669. psychopy/app/Resources/psychopySplash.png +0 -0
  670. psychopy/app/Resources/psychopySplash@2x.png +0 -0
  671. psychopy/app/builder/builder.py.orig +0 -3932
  672. psychopy/app/builder/dialogs/__init__.py.orig +0 -1679
  673. psychopy/app/builder/dialogs/paramCtrls.py.orig +0 -713
  674. psychopy/app/colorpicker/__init__.py.orig +0 -411
  675. psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN.mo +0 -0
  676. psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN.po +0 -6127
  677. psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN_allFlagged.mo +0 -0
  678. psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN_allFlagged.po +0 -7366
  679. psychopy/core.py.orig +0 -169
  680. psychopy/demos/builder/.DS_Store +0 -0
  681. psychopy/demos/builder/Design Templates/randomisedBlocks/html/index.html +0 -23
  682. psychopy/demos/builder/Design Templates/randomisedBlocks/html/randomisedBlocks-legacy-browsers.js +0 -423
  683. psychopy/demos/builder/Design Templates/randomisedBlocks/html/randomisedBlocks.js +0 -427
  684. psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/chooseBlock.xlsx +0 -0
  685. psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/facesBlock.xlsx +0 -0
  686. psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/housesBlock.xlsx +0 -0
  687. psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face01.jpg +0 -0
  688. psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face02.jpg +0 -0
  689. psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face03.jpg +0 -0
  690. psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house01.jpg +0 -0
  691. psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house02.jpg +0 -0
  692. psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house03.jpg +0 -0
  693. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.py +0 -330
  694. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks_lastrun.py +0 -330
  695. psychopy/demos/builder/Experiments/.DS_Store +0 -0
  696. psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
  697. psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +0 -61
  698. psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +0 -91
  699. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
  700. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
  701. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
  702. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
  703. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
  704. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
  705. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
  706. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
  707. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
  708. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
  709. psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
  710. psychopy/demos/builder/Feature Demos/eyetracking/eyetracking.xsd +0 -120
  711. psychopy/demos/builder/Tools/.DS_Store +0 -0
  712. psychopy/demos/builder/Tools/gammaCalibration/.DS_Store +0 -0
  713. psychopy/demos/builder/Tools/gammaCalibration/data/.DS_Store +0 -0
  714. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.csv +0 -38
  715. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.log +0 -3418
  716. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.psydat +0 -0
  717. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.csv +0 -2
  718. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.log +0 -15
  719. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.psydat +0 -0
  720. psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual.psyexp +0 -323
  721. psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual.py +0 -562
  722. psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
  723. psychopy/demos/builder/Tools/gammaCalibration/questStairs.xlsx +0 -0
  724. psychopy/demos/builder/Tools/gammaCalibration/resources/low_contrast.png +0 -0
  725. psychopy/demos/builder/Tools/gammaCalibration/resources/make_2nd_order_tex.py +0 -59
  726. psychopy/demos/builder/Tools/gammaCalibration/resources/second_order_tex.png +0 -0
  727. psychopy/demos/coder/.DS_Store +0 -0
  728. psychopy/demos/coder/experiment control/info_gamma.pickle +0 -0
  729. psychopy/demos/coder/iohub/.iohpid +0 -1
  730. psychopy/demos/coder/iohub/eyetracking/.iohpid +0 -1
  731. psychopy/demos/coder/iohub/wintab/.DS_Store +0 -0
  732. psychopy/demos/coder/stimuli/.DS_Store +0 -0
  733. psychopy/demos/coder/stimuli/radialGratingContracting.py +0 -29
  734. psychopy/experiment/_experiment.py.orig +0 -1032
  735. psychopy/experiment/components/.DS_Store +0 -0
  736. psychopy/experiment/components/_base.py.orig +0 -823
  737. psychopy/experiment/components/form/.DS_Store +0 -0
  738. psychopy/experiment/components/microphone/__init__.py.orig +0 -490
  739. psychopy/experiment/components/settings/__init__.py.orig +0 -1337
  740. psychopy/experiment/components/textbox/__init__.py.orig +0 -310
  741. psychopy/experiment/components/webcam/.DS_Store +0 -0
  742. psychopy/experiment/components/webcam/light/.DS_Store +0 -0
  743. psychopy/experiment/loops.py.orig +0 -829
  744. psychopy/experiment/params.py.orig +0 -408
  745. psychopy/experiment/routine.py.orig +0 -503
  746. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
  747. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
  748. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
  749. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
  750. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
  751. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
  752. psychopy/hardware/.DS_Store +0 -0
  753. psychopy/hardware/brainproducts.py.orig +0 -680
  754. psychopy/hardware/iolab.py.orig +0 -238
  755. psychopy/hardware/serialport.py +0 -51
  756. psychopy/iohub/datastore/__init__.py.orig +0 -443
  757. psychopy/iohub/datastore/util.py.orig +0 -692
  758. psychopy/iohub/devices/mouse/darwin.py.orig +0 -427
  759. psychopy/iohub/devices/mouse/linux2.py.orig +0 -198
  760. psychopy/preferences/.DS_Store +0 -0
  761. psychopy/projects/pavlovia.py.orig +0 -1295
  762. psychopy/tests/.DS_Store +0 -0
  763. psychopy/tests/data/.DS_Store +0 -0
  764. psychopy/tests/data/TestCircle_fill_local.png +0 -0
  765. psychopy/tests/data/__test.png +0 -0
  766. psychopy/tests/data/aperture1_normHexbackground_local.png +0 -0
  767. psychopy/tests/data/aperture1_norm_local.png +0 -0
  768. psychopy/tests/data/aperture2_normHexbackground_local.png +0 -0
  769. psychopy/tests/data/beatandrcos_height_local.png +0 -0
  770. psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
  771. psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
  772. psychopy/tests/data/beatandrcos_norm_local.png +0 -0
  773. psychopy/tests/data/beatandrcos_stencil_local.png +0 -0
  774. psychopy/tests/data/blend_add_height_local.png +0 -0
  775. psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
  776. psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
  777. psychopy/tests/data/blend_add_normNoShade_local.png +0 -0
  778. psychopy/tests/data/blend_add_norm_local.png +0 -0
  779. psychopy/tests/data/blend_add_stencil_local.png +0 -0
  780. psychopy/tests/data/bufferimg_gabor_height_local.png +0 -0
  781. psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
  782. psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
  783. psychopy/tests/data/bufferimg_gabor_normNoShade_local.png +0 -0
  784. psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
  785. psychopy/tests/data/bufferimg_gabor_stencil_local.png +0 -0
  786. psychopy/tests/data/circleHex_height_local.png +0 -0
  787. psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
  788. psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
  789. psychopy/tests/data/circleHex_normNoShade_local.png +0 -0
  790. psychopy/tests/data/circleHex_norm_local.png +0 -0
  791. psychopy/tests/data/circleHex_stencil_local.png +0 -0
  792. psychopy/tests/data/color_comparison_local.png +0 -0
  793. psychopy/tests/data/corrFullRandom_local.csv +0 -16
  794. psychopy/tests/data/corrFullRandom_local.tsv +0 -6
  795. psychopy/tests/data/correctScript/.DS_Store +0 -0
  796. psychopy/tests/data/dots_height_local.png +0 -0
  797. psychopy/tests/data/dots_normAddBlend_local.png +0 -0
  798. psychopy/tests/data/dots_normHexbackground_local.png +0 -0
  799. psychopy/tests/data/dots_normNoShade_local.png +0 -0
  800. psychopy/tests/data/dots_norm_local.png +0 -0
  801. psychopy/tests/data/dots_stencil_local.png +0 -0
  802. psychopy/tests/data/elarray1_height_local.png +0 -0
  803. psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
  804. psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
  805. psychopy/tests/data/elarray1_norm_local.png +0 -0
  806. psychopy/tests/data/elarray1_stencil_local.png +0 -0
  807. psychopy/tests/data/envelopeandrcos_height_local.png +0 -0
  808. psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
  809. psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
  810. psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
  811. psychopy/tests/data/envelopeandrcos_stencil_local.png +0 -0
  812. psychopy/tests/data/envelopepowerandrcos_height_local.png +0 -0
  813. psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
  814. psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
  815. psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
  816. psychopy/tests/data/envelopepowerandrcos_stencil_local.png +0 -0
  817. psychopy/tests/data/gabor1_height_local.png +0 -0
  818. psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
  819. psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
  820. psychopy/tests/data/gabor1_normNoShade_local.png +0 -0
  821. psychopy/tests/data/gabor1_norm_local.png +0 -0
  822. psychopy/tests/data/gabor1_stencil_local.png +0 -0
  823. psychopy/tests/data/greyscale_normHexbackground_local.png +0 -0
  824. psychopy/tests/data/imageAndGauss_height_local.png +0 -0
  825. psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
  826. psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
  827. psychopy/tests/data/imageAndGauss_normNoShade_local.png +0 -0
  828. psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
  829. psychopy/tests/data/imageAndGauss_stencil_local.png +0 -0
  830. psychopy/tests/data/movFrame1_stencil_local.png +0 -0
  831. psychopy/tests/data/noiseAndRcos_height_local.png +0 -0
  832. psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
  833. psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
  834. psychopy/tests/data/noiseAndRcos_normNoShade_local.png +0 -0
  835. psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
  836. psychopy/tests/data/noiseAndRcos_stencil_local.png +0 -0
  837. psychopy/tests/data/noiseFiltersAndRcos_height_local.png +0 -0
  838. psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
  839. psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
  840. psychopy/tests/data/noiseFiltersAndRcos_normNoShade_local.png +0 -0
  841. psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
  842. psychopy/tests/data/noiseFiltersAndRcos_stencil_local.png +0 -0
  843. psychopy/tests/data/numpyImage_height_local.png +0 -0
  844. psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
  845. psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
  846. psychopy/tests/data/numpyImage_normNoShade_local.png +0 -0
  847. psychopy/tests/data/numpyImage_norm_local.png +0 -0
  848. psychopy/tests/data/numpyImage_stencil_local.png +0 -0
  849. psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
  850. psychopy/tests/data/shape2_1_normHexbackground_local.png +0 -0
  851. psychopy/tests/data/shape2_1_normNoShade_local.png +0 -0
  852. psychopy/tests/data/shape2_1_norm_local.png +0 -0
  853. psychopy/tests/data/shape2_1_stencil_local.png +0 -0
  854. psychopy/tests/data/testLoopsBlocks.psyexp_local.py +0 -328
  855. psychopy/tests/data/text1_height_local.png +0 -0
  856. psychopy/tests/data/text1_normAddBlend_local.png +0 -0
  857. psychopy/tests/data/text1_normHexbackground_local.png +0 -0
  858. psychopy/tests/data/text1_norm_local.png +0 -0
  859. psychopy/tests/data/text1_stencil_local.png +0 -0
  860. psychopy/tests/data/text2_height.png +0 -0
  861. psychopy/tests/data/text2_normAddBlend.png +0 -0
  862. psychopy/tests/data/text2_normHexbackground.png +0 -0
  863. psychopy/tests/data/text2_stencil.png +0 -0
  864. psychopy/tests/data/wedge1_height_local.png +0 -0
  865. psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
  866. psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
  867. psychopy/tests/data/wedge1_normNoShade_local.png +0 -0
  868. psychopy/tests/data/wedge1_norm_local.png +0 -0
  869. psychopy/tests/data/wedge1_stencil_local.png +0 -0
  870. psychopy/tests/test_app/.DS_Store +0 -0
  871. psychopy/tests/test_app/test_builder/.DS_Store +0 -0
  872. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.csv +0 -9
  873. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.log +0 -177
  874. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.psydat +0 -0
  875. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.xlsx +0 -0
  876. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.csv +0 -9
  877. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.log +0 -168
  878. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.psydat +0 -0
  879. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.xlsx +0 -0
  880. psychopy/tests/test_data/.DS_Store +0 -0
  881. psychopy/tests/test_hardware/test_CRS_BitsSharp.py +0 -67
  882. psychopy/tests/test_hardware/test_CRS_BitsSharp.py.orig +0 -68
  883. psychopy/tests/test_hardware/test_CRS_bitsShaders.py +0 -110
  884. psychopy/tests/test_visual/test_image.py.orig +0 -219
  885. psychopy/visual/basevisual.py.orig +0 -1723
  886. psychopy/visual/form.py.orig +0 -1181
  887. psychopy/visual/text.py.orig +0 -752
  888. psychopy/visual/textbox2/textbox2.py.orig +0 -1315
  889. psychopy/visual/windowwarp.py.orig +0 -463
  890. /psychopy/{app/cortex.log → alerts/alertsCatalogue/3600.yaml} +0 -0
  891. /psychopy/{app/Resources → assets}/fonts/Arvo-Bold.ttf +0 -0
  892. /psychopy/{app/Resources → assets}/fonts/Arvo-BoldItalic.ttf +0 -0
  893. /psychopy/{app/Resources → assets}/fonts/Arvo-Italic.ttf +0 -0
  894. /psychopy/{app/Resources → assets}/fonts/Arvo-Regular.ttf +0 -0
  895. /psychopy/{app/Resources → assets}/fonts/DejaVuSerif.ttf +0 -0
  896. /psychopy/{app/Resources → assets}/fonts/IndieFlower-Regular.ttf +0 -0
  897. /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  898. /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
  899. /psychopy/demos/builder/Experiments/{GoNoGo → goNoGo}/readme.md +0 -0
  900. /psychopy/{demos/builder/Tools/gammaCalibration/readme.md → tests/test_plugins/__init__.py} +0 -0
  901. {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/WHEEL +0 -0
  902. {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/entry_points.txt +0 -0
  903. {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/licenses/LICENSE +0 -0
@@ -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-2024 Open Science Tools Ltd.
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__":
@@ -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
@@ -10,6 +10,7 @@ from . import theme as appTheme
10
10
  retStr = ""
11
11
  resources = Path(prefs.paths['resources'])
12
12
  iconCache = {}
13
+ pluginIconFiles = []
13
14
 
14
15
 
15
16
  class BaseIcon:
@@ -144,9 +145,7 @@ class ButtonIcon(BaseIcon):
144
145
  if theme is None:
145
146
  theme = appTheme.icons
146
147
  # Get all files in the resource folder containing the given stem
147
- matches = [f for f in resources.glob(f"**/{stem}*.png")]
148
- # get all icons from plugins
149
- matches += findPluginIcons(stem)
148
+ matches = [f for f in resources.glob(f"**/{stem}*.png")] + pluginIconFiles
150
149
  # Create blank arrays to store retina and non-retina files
151
150
  ret = {}
152
151
  nret = {}
@@ -263,38 +262,3 @@ class ComponentIcon(BaseIcon):
263
262
  self._beta = wx.Bitmap(combined)
264
263
 
265
264
  return self._beta
266
-
267
-
268
- def findPluginIcons(stem):
269
- """
270
- Search icons added by plugins for any matching the given file stem.
271
-
272
- Parameters
273
- ----------
274
- stem : str
275
- The file stem (aka the filename without `.png` on the end) to search for - will also find
276
- files beginning with the given stem (e.g. "globe" will also find "globe@2x.png")
277
-
278
- Returns
279
- -------
280
- list[Path]
281
- List of file paths for found icons
282
- """
283
- from psychopy.plugins import getEntryPointGroup
284
- # start off with no files
285
- files = []
286
- # iterate through found entry points
287
- for ep in getEntryPointGroup("psychopy.app.themes.icons"):
288
- try:
289
- # try to load module
290
- mod = ep.load()
291
- # get module folder
292
- folder = Path(mod.__file__).parent
293
- # add all matching .png files from that folder
294
- for file in folder.glob(f"**/{stem}*.png"):
295
- files.append(file)
296
- except:
297
- # if it fails for any reason, skip it
298
- logging.warn(f"Failed to load {ep.value}")
299
-
300
- return files
@@ -5,7 +5,7 @@
5
5
  """
6
6
 
7
7
  # Part of the PsychoPy library
8
- # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2024 Open Science Tools Ltd.
8
+ # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
9
9
  # Distributed under the terms of the GNU General Public License (GPL).
10
10
 
11
11
  import wx
psychopy/app/utils.py CHANGED
@@ -2,7 +2,7 @@
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
4
  # Part of the PsychoPy library
5
- # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2024 Open Science Tools Ltd.
5
+ # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
6
6
  # Distributed under the terms of the GNU General Public License (GPL).
7
7
 
8
8
  """utility classes for the Builder
@@ -1555,7 +1555,7 @@ def sanitize(inStr):
1555
1555
  """
1556
1556
  # Key-value pairs of patterns with what to replace them with
1557
1557
  patterns = {
1558
- "https\:\/\/oauth2\:[\d\w]{64}@gitlab\.pavlovia\.org\/.*\.git": "[[OAUTH key hidden]]" # Remove any oauth keys
1558
+ r"https\:\/\/oauth2\:[\d\w]{64}@gitlab\.pavlovia\.org\/.*\.git": "[[OAUTH key hidden]]" # Remove any oauth keys
1559
1559
  }
1560
1560
  # Replace each pattern
1561
1561
  for pattern, repl in patterns.items():
@@ -1671,7 +1671,7 @@ def sanitize(inStr):
1671
1671
  """
1672
1672
  # Key-value pairs of patterns with what to replace them with
1673
1673
  patterns = {
1674
- "https\:\/\/oauth2\:[\d\w]{64}@gitlab\.pavlovia\.org\/.*\.git": "[[OAUTH key hidden]]" # Remove any oauth keys
1674
+ r"https:\/\/oauth2:[\d\w]{64}@gitlab\.pavlovia\.org\/.*\.git": "[[OAUTH key hidden]]" # Remove any oauth keys
1675
1675
  }
1676
1676
  # Replace each pattern
1677
1677
  for pattern, repl in patterns.items():
Binary file
Binary file
psychopy/clock.py CHANGED
@@ -16,7 +16,7 @@ Clock logic.
16
16
  """
17
17
 
18
18
  # Part of the PsychoPy library
19
- # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2024 Open Science Tools Ltd.
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
  import logging
22
22
  import time
@@ -497,6 +497,9 @@ class StaticPeriod:
497
497
  wait(timeRemaining)
498
498
 
499
499
  return 1
500
+
501
+ def getDuration(self):
502
+ return self.countdown._countdown_duration
500
503
 
501
504
 
502
505
  def _dispatchWindowEvents():
psychopy/colors.py CHANGED
@@ -383,6 +383,8 @@ class Color:
383
383
  return self._renderCache[space]
384
384
  # Transform contrast to match rgb
385
385
  contrast = self.contrast
386
+ if contrast is None:
387
+ contrast = 1
386
388
  contrast = np.reshape(contrast, (-1, 1))
387
389
  contrast = np.hstack((contrast, contrast, contrast))
388
390
  # Multiply
psychopy/core.py CHANGED
@@ -4,7 +4,7 @@
4
4
  """Basic functions, including timing, rush (imported), quit
5
5
  """
6
6
  # Part of the PsychoPy library
7
- # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2024 Open Science Tools Ltd.
7
+ # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
8
8
  # Distributed under the terms of the GNU General Public License (GPL).
9
9
 
10
10
  import sys
psychopy/data/base.py CHANGED
@@ -540,7 +540,7 @@ class DataHandler(_ComparisonMixin, dict):
540
540
  # check whether data falls within bounds
541
541
  posArr = np.asarray(position)
542
542
  shapeArr = np.asarray(self.dataShape)
543
- if not np.alltrue(posArr < shapeArr):
543
+ if not np.all(posArr < shapeArr):
544
544
  # array isn't big enough
545
545
  logging.warning('need a bigger array for: ' + thisType)
546
546
  # not implemented yet!
@@ -11,7 +11,7 @@ from psychopy import constants, clock
11
11
  from psychopy import logging
12
12
  from psychopy.data.trial import TrialHandler2
13
13
  from psychopy.tools.filetools import (openOutputFile, genDelimiter,
14
- genFilenameFromDelimiter)
14
+ genFilenameFromDelimiter, handleFileCollision)
15
15
  from psychopy.localization import _translate
16
16
  from .utils import checkValidFilePath
17
17
  from .base import _ComparisonMixin
@@ -95,7 +95,7 @@ class ExperimentHandler(_ComparisonMixin):
95
95
  self.originPath = originPath
96
96
  self.savePickle = savePickle
97
97
  self.saveWideText = saveWideText
98
- self.dataFileName = dataFileName
98
+ self.dataFileName = handleFileCollision(dataFileName, "rename")
99
99
  self.sortColumns = sortColumns
100
100
  self.thisEntry = {}
101
101
  self.entries = [] # chronological list of entries
@@ -108,6 +108,10 @@ class ExperimentHandler(_ComparisonMixin):
108
108
  self.autoLog = autoLog
109
109
  self.appendFiles = appendFiles
110
110
  self.status = constants.NOT_STARTED
111
+ # dict of filenames to collision method to be used next time it's saved
112
+ self._nextSaveCollision = {}
113
+ # list of call profiles for connected save methods
114
+ self.connectedSaveMethods = []
111
115
 
112
116
  if dataFileName in ['', None]:
113
117
  logging.warning('ExperimentHandler created with no dataFileName'
@@ -422,6 +426,9 @@ class ExperimentHandler(_ComparisonMixin):
422
426
  """
423
427
  Set status to be PAUSED.
424
428
  """
429
+ logging.exp(_translate(
430
+ "Experiment '{}' paused."
431
+ ).format(self.name))
425
432
  # warn if experiment is already paused
426
433
  if self.status == constants.PAUSED:
427
434
  logging.warn(_translate(
@@ -435,6 +442,9 @@ class ExperimentHandler(_ComparisonMixin):
435
442
  """
436
443
  Set status to be STARTED.
437
444
  """
445
+ logging.exp(_translate(
446
+ "Experiment '{}' resumed."
447
+ ).format(self.name))
438
448
  # warn if experiment is already running
439
449
  if self.status == constants.STARTED:
440
450
  logging.warn(_translate(
@@ -471,7 +481,7 @@ class ExperimentHandler(_ComparisonMixin):
471
481
  if not isinstance(self.currentLoop, TrialHandler2):
472
482
  return
473
483
  # skip trials in current loop
474
- self.currentLoop.skipTrials(n)
484
+ return self.currentLoop.skipTrials(n)
475
485
 
476
486
  def rewindTrials(self, n=1):
477
487
  """
@@ -487,7 +497,7 @@ class ExperimentHandler(_ComparisonMixin):
487
497
  if not isinstance(self.currentLoop, TrialHandler2):
488
498
  return
489
499
  # rewind trials in current loop
490
- self.currentLoop.rewindTrials(n)
500
+ return self.currentLoop.rewindTrials(n)
491
501
 
492
502
  def getAllTrials(self):
493
503
  """
@@ -610,13 +620,89 @@ class ExperimentHandler(_ComparisonMixin):
610
620
  entries.append(self.thisEntry)
611
621
  return entries
612
622
 
623
+ def queueNextCollision(self, fileCollisionMethod, fileName=None):
624
+ """
625
+ Tell this ExperimentHandler than, next time the named file is saved, it should handle
626
+ collisions a certain way. This is useful if you want to save multiple times within an
627
+ experiment.
628
+
629
+ Parameters
630
+ ----------
631
+ fileCollisionMethod : str
632
+ File collision method to use, see `saveAsWideText` or `saveAsPickle` for
633
+ details.
634
+ fileName : str
635
+ Filename to queue collision on, if None (default) will use this ExperimentHandler's
636
+ `dataFileName`
637
+ """
638
+ # handle default
639
+ if fileName is None:
640
+ fileName = self.dataFileName
641
+ # make filename iterable
642
+ if not isinstance(fileName, (list, tuple)):
643
+ fileName = [fileName]
644
+ # queue collision
645
+ for thisFileName in fileName:
646
+ self._nextSaveCollision[thisFileName] = fileCollisionMethod
647
+
648
+ def connectSaveMethod(self, fcn, *args, **kwargs):
649
+ """
650
+ Tell this experiment handler to call the given function with the given arguments and
651
+ keyword arguments whenever it saves its own data.
652
+
653
+ Parameters
654
+ ----------
655
+ fcn : function
656
+ Function to call
657
+ *args
658
+ Positional arguments to be given to the function when it's called
659
+ **kwargs
660
+ Keyword arguments to be given to the function when it's called
661
+ """
662
+ # create a call profile for the given function
663
+ profile = {
664
+ 'fcn': fcn,
665
+ 'args': args,
666
+ 'kwargs': kwargs
667
+ }
668
+ # connect it
669
+ self.connectedSaveMethods.append(profile)
670
+
671
+ def save(self):
672
+ """
673
+ Work out from own settings how to save, then use the appropriate method (saveAsWideText,
674
+ saveAsPickle, etc.)
675
+ """
676
+ savedNames = []
677
+ if self.dataFileName not in ['', None]:
678
+ if self.autoLog:
679
+ msg = 'Saving data for %s ExperimentHandler' % self.name
680
+ logging.debug(msg)
681
+ if self.savePickle:
682
+ savedNames.append(
683
+ self.saveAsPickle(self.dataFileName)
684
+ )
685
+ if self.saveWideText:
686
+ savedNames.append(
687
+ self.saveAsWideText(self.dataFileName + '.csv')
688
+ )
689
+ else:
690
+ logging.warn(
691
+ "ExperimentHandler.save was called on an ExperimentHandler with no dataFileName set."
692
+ )
693
+ # call connected save functions
694
+ for profile in self.connectedSaveMethods:
695
+ profile['fcn'](*profile['args'], **profile['kwargs'])
696
+
697
+ return savedNames
698
+
613
699
  def saveAsWideText(self,
614
700
  fileName,
615
701
  delim='auto',
616
702
  matrixOnly=False,
617
703
  appendFile=None,
618
704
  encoding='utf-8-sig',
619
- fileCollisionMethod='rename',
705
+ fileCollisionMethod=None,
620
706
  sortColumns=None):
621
707
  """Saves a long, wide-format text file, with one line representing
622
708
  the attributes and data for a single trial. Suitable for analysis
@@ -632,38 +718,43 @@ class ExperimentHandler(_ComparisonMixin):
632
718
  which can be handy if you want to append data to an existing file
633
719
  of the same format.
634
720
 
635
- :Parameters:
636
-
637
- fileName:
638
- if extension is not specified, '.csv' will be appended if
639
- the delimiter is ',', else '.tsv' will be appended.
640
- Can include path info.
721
+ Parameters
722
+ ----------
641
723
 
642
- delim:
643
- allows the user to use a delimiter other than the default
644
- tab ("," is popular with file extension ".csv")
724
+ fileName:
725
+ if extension is not specified, '.csv' will be appended if
726
+ the delimiter is ',', else '.tsv' will be appended.
727
+ Can include path info.
645
728
 
646
- matrixOnly:
647
- outputs the data with no header row.
729
+ delim:
730
+ allows the user to use a delimiter other than the default
731
+ tab ("," is popular with file extension ".csv")
648
732
 
649
- appendFile:
650
- will add this output to the end of the specified file if
651
- it already exists.
733
+ matrixOnly:
734
+ outputs the data with no header row.
652
735
 
653
- encoding:
654
- The encoding to use when saving a the file.
655
- Defaults to `utf-8-sig`.
736
+ appendFile:
737
+ will add this output to the end of the specified file if
738
+ it already exists.
656
739
 
657
- fileCollisionMethod:
658
- Collision method passed to
659
- :func:`~psychopy.tools.fileerrortools.handleFileCollision`
740
+ encoding:
741
+ The encoding to use when saving a the file.
742
+ Defaults to `utf-8-sig`.
660
743
 
661
- sortColumns : str or bool
662
- How (if at all) to sort columns in the data file. Can be:
663
- - "alphabetical", "alpha", "a" or True: Sort alphabetically by header name
664
- - "priority", "pr" or "p": Sort according to priority
665
- - other: Do not sort, columns remain in order they were added
744
+ fileCollisionMethod:
745
+ Collision method passed to
746
+ :func:`~psychopy.tools.fileerrortools.handleFileCollision`
666
747
 
748
+ sortColumns : str or bool
749
+ How (if at all) to sort columns in the data file. Can be:
750
+ - "alphabetical", "alpha", "a" or True: Sort alphabetically by header name
751
+ - "priority", "pr" or "p": Sort according to priority
752
+ - other: Do not sort, columns remain in order they were added
753
+
754
+ Returns
755
+ -------
756
+ str
757
+ Final filename (including _1, _2, etc. and file extension) which data was saved as
667
758
  """
668
759
  # set default delimiter if none given
669
760
  delimOptions = {
@@ -678,6 +769,11 @@ class ExperimentHandler(_ComparisonMixin):
678
769
 
679
770
  if appendFile is None:
680
771
  appendFile = self.appendFiles
772
+ # check for queued collision methods if using default, fallback to rename
773
+ if fileCollisionMethod is None and fileName in self._nextSaveCollision:
774
+ fileCollisionMethod = self._nextSaveCollision.pop(fileName)
775
+ elif fileCollisionMethod is None:
776
+ fileCollisionMethod = "rename"
681
777
 
682
778
  # create the file or send to stdout
683
779
  fileName = genFilenameFromDelimiter(fileName, delim)
@@ -730,15 +826,23 @@ class ExperimentHandler(_ComparisonMixin):
730
826
  f.close()
731
827
  logging.info('saved data to %r' % f.name)
732
828
 
733
- def saveAsPickle(self, fileName, fileCollisionMethod='rename'):
829
+ return fileName
830
+
831
+ def saveAsPickle(self, fileName, fileCollisionMethod=None):
734
832
  """Basically just saves a copy of self (with data) to a pickle file.
735
833
 
736
834
  This can be reloaded if necessary and further analyses carried out.
737
835
 
738
- :Parameters:
836
+ Parameters
837
+ ----------
739
838
 
740
- fileCollisionMethod: Collision method passed to
741
- :func:`~psychopy.tools.fileerrortools.handleFileCollision`
839
+ fileCollisionMethod : str
840
+ Collision method passed to :func:`~psychopy.tools.fileerrortools.handleFileCollision`
841
+
842
+ Returns
843
+ -------
844
+ str
845
+ Final filename (including _1, _2, etc. and file extension) which data was saved as
742
846
  """
743
847
  # Store the current state of self.savePickle and self.saveWideText
744
848
  # for later use:
@@ -754,16 +858,22 @@ class ExperimentHandler(_ComparisonMixin):
754
858
  savePickle = self.savePickle
755
859
  saveWideText = self.saveWideText
756
860
 
861
+ # append extension
862
+ if not fileName.endswith('.psydat'):
863
+ fileName += '.psydat'
864
+
865
+ # check for queued collision methods if using default, fallback to rename
866
+ if fileCollisionMethod is None and fileName in self._nextSaveCollision:
867
+ fileCollisionMethod = self._nextSaveCollision.pop(fileName)
868
+ elif fileCollisionMethod is None:
869
+ fileCollisionMethod = "rename"
870
+
757
871
  self.savePickle = False
758
872
  self.saveWideText = False
759
873
 
760
874
  origEntries = self.entries
761
875
  self.entries = self.getAllEntries()
762
876
 
763
- # otherwise use default location
764
- if not fileName.endswith('.psydat'):
765
- fileName += '.psydat'
766
-
767
877
  with openOutputFile(fileName=fileName, append=False,
768
878
  fileCollisionMethod=fileCollisionMethod) as f:
769
879
  pickle.dump(self, f)
@@ -775,6 +885,8 @@ class ExperimentHandler(_ComparisonMixin):
775
885
  self.savePickle = savePickle
776
886
  self.saveWideText = saveWideText
777
887
 
888
+ return fileName
889
+
778
890
  def getJSON(self, priorityThreshold=constants.priority.EXCLUDE+1):
779
891
  """
780
892
  Get the experiment data as a JSON string.
@@ -810,14 +922,7 @@ class ExperimentHandler(_ComparisonMixin):
810
922
  return json.dumps(context, indent=True, allow_nan=False, default=str)
811
923
 
812
924
  def close(self):
813
- if self.dataFileName not in ['', None]:
814
- if self.autoLog:
815
- msg = 'Saving data for %s ExperimentHandler' % self.name
816
- logging.debug(msg)
817
- if self.savePickle:
818
- self.saveAsPickle(self.dataFileName)
819
- if self.saveWideText:
820
- self.saveAsWideText(self.dataFileName + '.csv')
925
+ self.save()
821
926
  self.abort()
822
927
  self.autoLog = False
823
928
 
psychopy/data/routine.py CHANGED
@@ -53,4 +53,30 @@ class Routine:
53
53
  # starting status
54
54
  self.status = constants.NOT_STARTED
55
55
 
56
-
56
+ def getPlaybackComponents(self):
57
+ """
58
+ Get a list of all Components within this Routine which have a concept of playing and
59
+ pausing (Sound, Movie, etc.)
60
+ """
61
+ playbackComps = []
62
+ # iterate through all Components
63
+ for comp in self.components:
64
+ # if it has play and pause methods, append it
65
+ if hasattr(comp, 'play') and hasattr(comp, 'pause'):
66
+ playbackComps.append(comp)
67
+
68
+ return playbackComps
69
+
70
+ def getDispatchComponents(self):
71
+ """
72
+ Get a list of all Components within this Routine which have a method for dispatching
73
+ messages from a response device.
74
+ """
75
+ dispatchComps = []
76
+ # iterate through all Components
77
+ for comp in self.components:
78
+ # if it has a device which has a dispatch method, append it
79
+ if hasattr(comp, 'device') and hasattr(comp.device, 'dispatchMessages'):
80
+ dispatchComps.append(comp)
81
+
82
+ return dispatchComps
@@ -1609,7 +1609,8 @@ class QuestPlusHandler(StairHandler):
1609
1609
 
1610
1610
  # if needed replace the existing intensity with this custom one
1611
1611
  if intensity is not None:
1612
- self.intensities.pop()
1612
+ if len(self.intensities) != 0: # avoid error during the first trial where self.intensities will be of length 0, so pop does not work
1613
+ self.intensities.pop() # remove the auto-generated one
1613
1614
  self.intensities.append(intensity)
1614
1615
  # add the current data to experiment if possible
1615
1616
  if self.getExp() is not None: