Releases: psychopy/psychopy
2026.1.3
Fixes
PsychoPy
- Account for units when rotating text in TextBox by @TEParsons in #7592
PsychoPy Studio
- Check whether the file member is non-empty (coder) by @aforren1 in psychopy/psychopy-studio#64
- Fix bug with finding a newly created Pavlovia project by @TEParsons in psychopy/psychopy-studio#65
- Remove unecessary
varstatements from Code Component auto translation by @TEParsons in psychopy/psychopy-studio#67 - Pavlovia sync was pushing changes before the user is done making the commit by @TEParsons in psychopy/psychopy-studio#68
Full Changelogs:
2026.1.2
Fixes
PsychoPy
- Skip camera devices with no available formats by @aforren1 in #7568
- Use Version "latest" should be treated the same as blank by @TEParsons in #7570
- Silence unnecessary "Stopping key buffers" warning by @TEParsons in #7569
- Handle
"True"and"False"in preferences when set from JSON by @TEParsons in #7579 - Handle when the size of a MovieStim is None by @TEParsons in #7581
- Fix display of eyetracker params in Experiment Settings by @TEParsons in #7585
PsychoPy Studio
- Fix "Reinstall Python" button by @TEParsons in psychopy/psychopy-studio#29
- Remove confusing "Manage Projects" menu item by @TEParsons in psychopy/psychopy-studio#28
- Wait for plugins to have activated before setting up devices in Device Manager by @TEParsons in psychopy/psychopy-studio#30
- Tickbox to hide startup tips wasn't saved properly by @TEParsons in psychopy/psychopy-studio#41
- Console couldn't handle multiline statements by @TEParsons in psychopy/psychopy-studio#40
-
- button in Coder notepad did nothing by @TEParsons in psychopy/psychopy-studio#39
- Check whether the file member is non-empty by @aforren1 in psychopy/psychopy-studio#45
- Coder save buttons were enabled when no file was open by @TEParsons in psychopy/psychopy-studio#51
- Open pavlovia page rather than gitlab page when clicking the project button by @TEParsons in psychopy/psychopy-studio#52
- Start off with "untitled.psyexp" in Save As... window by @TEParsons in psychopy/psychopy-studio#53
- Fix bug matching loop initiators to loop terminators in Builder flow by @TEParsons in psychopy/psychopy-studio#59
- Account for spaces in code which shows/hides params by @TEParsons in psychopy/psychopy-studio#60
Documentation & Testing
@TEParsons @RebeccaHirst @peircej
Full Changelogs
PsychoPy: 2026.1.1...2026.1.2
PsychoPy Studio: psychopy/psychopy-studio@2026.1.1...2026.1.2
2026.1.1
Fixes
- Fix Search and New buttons on Pavlovia project control by @TEParsons in psychopy/psychopy-studio#17
- App version number was duplicated when sending usage report by @TEParsons in psychopy/psychopy-studio#21
- Adding a Pavlovia Survey to the flow was crashing the UI by @TEParsons in psychopy/psychopy-studio#20
- Fixes to Device Manager and related Components by @TEParsons in psychopy/psychopy-studio#22
- Fix error in Find dialog by @TEParsons in #7564
- Relabel dialog box "Okay" to (more standard) "OK" by @TEParsons in psychopy/psychopy-studio#23
- Scroll to bottom of code output when a new message comes in by @TEParsons in psychopy/psychopy-studio#24
- Fix problem staging changes when syncing by @TEParsons in psychopy/psychopy-studio#26
Full Changelog: 2026.1.0...2026.1.1
2026.1.0
Introducing PsychoPy Studio
PsychoPy Studio is a full rebuild of the PsychoPy desktop app using web-based libraries (Svelte and Electron). The underlying experiment engine (the PsychoPy library) is still Python, but Studio provides a smoother, more user-friendly interface (think drag and drop routines…) and better version independence with useVersion.
As always, the code is fully open source, you can view and contribute here. Eventually, PsychoPy Studio will replace the standalone PsychoPy app, but we plan to maintain both for a few major releases while the dust settles.
Read more about PsychoPy Studio here
PsychoPy 2026.1.0
Same as any release, PsychoPy 2026.1.0 also comes with fixes and improvements to PsychoPy itself.
Highlights
- A known bug with Mac retina screens which was affecting the reliability of frame timings has been fixed by @mdcutone in #7502
- Object detection in camera streams by @mdcutone in #7490
- Add support for displaying plots with
ImageStimby @mdcutone in #7382
Improvements
- Store pilot mode in data file by @TEParsons in #7378
- Add method to TrialHandler for queueing a trial as next by @TEParsons in #7412
- Add dedicated paramCtrl for PsychoPy version by @TEParsons in #7542
- Add a "FontFinder" for a more easily externally callable methods to get fonts known to PsychoPy by @TEParsons in #7448
- Added various methods for representing PsychoPy objects as JSON, for compatability with PsychoPy Studio by @TEParsons in #7359, #7353, #7376, #7377, #7368, #7380, #7388, #7484, #7491, #7514
Fixes
- Find dialog now includes params with "set during..." matching the search term by @TEParsons in #7385
- Added code to maintain external spectral calibration by @wadelab in #7372
- Allow multiple joysticks when using the Pyglet backend by @mdcutone in #7414
- Correctly get the number of joystick devices by @rlaboiss in #7434
- Use expanding lists to avoid index errors with buttonboxes and sensors by @TEParsons in #7458
- Stop all playback Components (Sound, Movie, etc.) when experiment ends by @TEParsons in #7461
- Fix SyntaxError due to docstring by @mscheltienne in #7479
- clamp StairHandler intensity when step size is negative by @stephenmjerge in #7475
- Fix AttributeError: KeyboardDevice missing _buffers attribute wo PTB by @wadelab in #7494
- ExperimentHandler not saving extraInfo to wide text by @davidmwatson in #7374
- Fix Auto->JS isinstance(list) to Array by @stephenmjerge in #7533
- Fix bug in preferences dialog handling speakers named "default" by @TEParsons in #7499
- Allow iohub errors in clients to be logged by @mdcutone in #7532
- Fixed issue with plugins window not opening by @peircej in #7546
- Fixes errors when opening Monitor Center (wx app) by @mdcutone in #7541
- Changes to support 3D mesh rendering again by @mdcutone in #7530
- Revert to old-style file list ctrl by @TEParsons in #7558
- Use a dedicated param ctrl for choosing validators by @TEParsons in #7421
Other Changes
- Move code to run PsychoJS locally out of the app and into the library by @TEParsons in #7467
- Move psydat2csv to tools by @TEParsons in #7487
New contributors
- @wadelab made their first contribution in #7372
- @stephenmjerge made their first contribution in #7475
- @Emil-Ant made their first contribution in #7519
Testing and documentation improvements
- @Emil-Ant ( #7519 )
- @RebeccaHirst ( #7455 )
- @TEParsons ( #7515, #7481 )
- @mdcutone ( #7468 )
Full Changelog: 2025.2.4...2026.1.0
2025.2.4
What's changed
Fixes
- Fix error & missing refresh token when logging in from saved details by @TEParsons in #7513
- Fix error when loading some experiments by @TEParsons in #7504
Documentation
Full Changelog: 2025.2.3...2025.2.4
2025.2.3
GitLab compatibility
Pavlovia will soon be upgrading to a newer version of GitLab in which authentication tokens have a maximum shelf life of 2 hours. This release of PsychoPy is the first to include automatic token renewal, allowing you to be seamlessly re-authenticated without having to manually log back in. In prior versions, once Pavlovia has updated, you will have to manually log back in every 2 hours. We apologise for the inconvenience, unfortunately this is essential for your data security.
Bug Fixes
- Fix bug where renamed user details weren't available from Pavlovia by @TEParsons in #7460
- Fixed param control text color selection when using system dark theme by @mdcutone in #7457
- When FontManager finds multiple matching fonts, sort them so the same one is always chosen by @TEParsons in #7464
- Make sure validation columns (stim.validator.started, etc.) exist even if validation fails by @TEParsons in #7466
- Don't use SetFont on Linux by @TEParsons in #7477
- When Pavlovia auth token expires, send a refresh request by @TEParsons in #7478
- Fixed
Mouse.getPos()returningfloat64typed objects instead offloatby @mdcutone in #7462 - Better handle when stimulus stop validation fails by @TEParsons in #7485
Documentation improvements
Full Changelog: 2025.2.2...2025.2.3
2025.2.2
What's Changed
- Fix unformatted warning when a device fails to scan by @TEParsons in #7445
- Visual validator was ignoring "Find threshold/sensor" params by @TEParsons in #7444
- Save unfinished mic recordings if the experiment is ended by e.g. pressing escape by @TEParsons in #7452
- Dollar label wasn't showing for some params by @TEParsons in #7436
- Silence confusing message in MouseComponent about params updating by @TEParsons in #7440
- Fix bug with saving data each trial by @TEParsons in #7437
Full Changelog: 2025.2.1...2025.2.2
2025.2.1
What's Changed
- Loop type wasn't updating loop ctrls by @TEParsons in #7366 7360
- Circle was triggering unecessary warnings about deprecation by @TEParsons in #7364
- Make Component dialog pages scrollable by @TEParsons in #7365
- Fix setting Polygon num. vertices each repeat by @TEParsons in #7379
- Fixed muting on movie player warmup and volume setter methods by @mdcutone in #7375
- Fixes for mouse input via
eventswhen multiple window backends are installed by @mdcutone in #7367 - Fix iohub recording state in Builder ouput by @mdcutone in #7370
- Fixed incorrect func ref in
getAllJoysticks()by @mdcutone in #7392 - Add mic query plist by @peircej in #7402
- Fix how the timeout param is written in SerialDevice by @TEParsons in #7400
- Importing
psychopy.appwhen writing scripts was slowing things down and breaking Use Version by @TEParsons in #7409 - Reset volume when movie is reloaded by @mdcutone in #7417
- Fix view and projection matrices not being applied before first flip by @mdcutone in #7381
- Handle when there's a file called "untitled.psyexp" in the app's root directory by @TEParsons in #7395
- Allow Session to use a relative path for its root folder by @TEParsons in #7399
- Add an "Add multiple" button to file list params by @TEParsons in #7383
- Fix confusing message on Sound when given a variable by @TEParsons in #7428
- Fixed loading ioHub settings from XML by device class name by @mdcutone in #7433
Full Changelog: 2025.2.0...2025.2.1
PsychoPy 2025.2.0
Highlights
🐍 = Works locally
🌐 = Works online
🐍 Reworked SerialComponent to give more control over what data is sent
🐍 Device Manager to consolidate working with a single device at multiple points in a study or across studies
🐍 Much better performance for movie playing and camera recordings (better buffering of frames)
🐍 Revamped photometer classes for easier gamma calibration
Other Changes
- Add example demo script for extracting hdf5 data by @RebeccaHirst in #7223
- fixed iohub compatibility with PyObjC>=8.0
- Plugin/package manager performance improvements by @mdcutone in #7194
- Fixes for numpy>=2.0 by @aforren1 in #7229
- New
endCurrentRoutinemethod for ExperimentHandler by @TEParsons in #7213 - Better updating of local language translation files by @hsogo in #7230
- Don't cancel upcoming iteration in TrialHandler2 if on last trial by @TEParsons in #7240
- Enable discarding previous responses in Button Box akin to keyboard by @TEParsons in #7250
- Fix erronious alert about missing transcriber (for Mic) when running locally by @TEParsons in #7258
- Don't search for experiment fonts if the experiment folder is the home directory by @TEParsons in #7257
- Allow overriding user preferences directory with PSYCHOPY_CONFIG_FOLDER environment variable by @wieluk in #7207
- Sound sensor volume was adjusted for 255 (when threshold is 0-1) by @TEParsons in #7261
- Enforce a minimum size on multiline text params by @TEParsons in #7263
- Fixed error when adding data to a row that's out of bounds by @TEParsons in #7266
- Handle when allowedKeys is just 1 multi-character string (e.g. "return") online by @TEParsons in #7268
- Improved movie playback performance for
MovieStimusing ffpyplayer by @mdcutone in #7264 - Handle when a file added to runner has been deleted by @TEParsons in #7276
- For Sesssion, set experiment start time and name in Experiment run function by @TEParsons in #7281
- Improved camera performance in local studies by @mdcutone in #7267
- Fix package indexing subprocess crash by @mdcutone in #7293
- Catch "Bad perspective string" errors on app launch by @TEParsons in #7298
- Fix gamma calibration button in Monitor Center by @TEParsons in #7304
- Better handling of legacy params for device Components by @TEParsons in #7308
- Various UI fixes by @TEParsons in #7311 #7312 and by @mdcutone in #7323
- Allow ButtonBox responses to be compared to dicts with the correct fields by @TEParsons in #7306
- Give more information when an image fails to load by @TEParsons in #7310
- Fix legacy photometer finding methods by @TEParsons in #7321
- Give more informative error when conditions file has duplicate names by @TEParsons in #7324
- Maintain aspect ratio when MovieStim size is None by @TEParsons in #7325
- Deprecated psychopy.voicekey (move to psychopy-legacy) by @TEParsons in #7326
New Contributors
- @bschiller8 made their first contribution in #7114
Full Changelog: 2025.1.1...2025.2.0
PsychoPy 2025.1.1
What's Changed
Bugs Fixed
- Respect existing opacity when setting a color by @TEParsons in #7200
- Fixed missing references to GazePoint sample event class by @mdcutone in #7228
- Fixed moviepy import for window frame capture by @sh4r11f in #7218
Other Changes
- Limiting PTB version for now (to 3.0.19, the last free version) by @peircej in #7204
- Allow numpy>=2.0 (#7229) by @mdcutone in #7231
- Many fixes to docs by @TEParsons and @RebeccaHirst
New Contributors
Full Changelog: 2025.1.0...2025.1.1