Skip to content

Update GUI assets import - #3370

Merged
deruyter92 merged 3 commits into
jaap/pathlib_path_policyfrom
cy/update-gui-assets-imports
Jun 25, 2026
Merged

Update GUI assets import#3370
deruyter92 merged 3 commits into
jaap/pathlib_path_policyfrom
cy/update-gui-assets-imports

Conversation

@C-Achard

@C-Achard C-Achard commented Jun 15, 2026

Copy link
Copy Markdown
Collaborator

As part of the efforts for path standardization in #3350, a few GUI assets-related calls could be improved.

This focuses on image and logo paths and aims to make the importing of these assets safer and more centralized.

Automated summary

This pull request refactors how GUI assets (like icons and images) are loaded and used throughout the DeepLabCut GUI. The main improvement is the introduction of a centralized utility module, gui_assets.py, which provides functions to access resources bundled with the application. This change replaces all previous direct file path constructions and QIcon/QPixmap usage with these new helper functions, making resource management more robust and portable.

The most important changes are:

Introduction of centralized GUI asset utilities:

  • Added a new module, deeplabcut/gui/gui_assets.py, which provides functions such as icon_from_resource and pixmap_from_resource to load icons and images from the application's assets directory in a consistent way.

Refactoring icon and image loading throughout the GUI:

Code cleanup and simplification:

  • Removed redundant imports and file path manipulations related to asset loading, further simplifying the codebase and reducing the risk of path-related errors. [1] [2] [3] [4] [5] [6]

These changes improve maintainability, portability, and reliability of the GUI resource handling.

@C-Achard C-Achard self-assigned this Jun 15, 2026
@C-Achard C-Achard added enhancement New feature or request GUI issues relating to GUI labels Jun 15, 2026
C-Achard and others added 3 commits June 25, 2026 17:28
Introduce deeplabcut.gui.gui_assets module providing utilities to load bundled GUI assets. It locates the package assets directory via importlib.resources, and exposes resource_bytes, resource_text, get_assets_dir, get_style_qss, pixmap_from_resource and icon_from_resource helpers (using PySide6 QPixmap/QIcon). Includes error handling when image data cannot be loaded and uses type annotations for clarity.
Replace direct filesystem asset loading (BASE_DIR/assets and manual Path lookups) with centralized gui_assets helpers (icon_from_resource, pixmap_from_resource, get_style_qss/get_assets_dir) across multiple GUI modules. Updated imports and calls in components, launch_script, create_project, modelzoo, open_project, train_network, and window to use the new resource functions and remove redundant logo path handling, improving resource access and packaging robustness.
@deruyter92
deruyter92 force-pushed the cy/update-gui-assets-imports branch from 44ba095 to c8ca7e0 Compare June 25, 2026 15:33
@deruyter92

Copy link
Copy Markdown
Collaborator

@C-Achard thanks for adding this, good fix!

rebased on updated source branch and fixed a path concatenation issue.

@deruyter92

Copy link
Copy Markdown
Collaborator

Merging this into #3370 now.

@deruyter92
deruyter92 marked this pull request as ready for review June 25, 2026 15:34
@deruyter92
deruyter92 merged commit 107a29a into jaap/pathlib_path_policy Jun 25, 2026
2 of 3 checks passed
@deruyter92
deruyter92 deleted the cy/update-gui-assets-imports branch June 25, 2026 15:35
deruyter92 added a commit that referenced this pull request Jul 15, 2026
* fix path resolution on network drives. Replace  Path(..).resolve() with Path(..).absolute()

* Add safe_resolve helper for path resolution

* replace str with pathlib.Path

* fix redundant resolution of resolved path in memory_replay.py

* fix open -> os.stat

* replace os.stat -> open for files, listdir for dirs.

* fix TestReadConfigProjectPath

* Update deeplabcut/utils/auxiliaryfunctions.py

* additional replacements: str ->Path

* Update function signatures str -> str | Path

* Add ruff linting rule PTH

* Open dataset file directly using Path.open

Fix path handling when loading the dataset pickle. The code previously attempted Path(project_path) / file_name even though file_name already included the project path, resulting in an incorrect path. This changes the context manager to call file_name.open('rb') directly, removing the redundant join and preventing path errors when loading the pickle.

* Use context manager when writing pose_cfg.yaml

Replace direct ruamel_file.dump(...open('w')) call with a with-statement to open pose_cfg.yaml. This ensures the file handle is properly closed after writing and avoids potential resource leaks.

* Pass string path to cv2.VideoCapture

Convert video_path to str when constructing cv2.VideoCapture to ensure pathlib.Path objects are handled correctly and avoid type errors when opening videos. This makes VideoReader more robust when given Path instances.

* Use explicit loop to unlink frame files

Replace the list-comprehension side-effect used to delete temporary frame files with an explicit for-loop that checks p.is_file() before calling unlink. This avoids building an unused list, prevents errors from trying to unlink non-file entries (e.g., directories), and improves readability and safety.

* Fix CircleCI failure

* fix Matplotlib Path import shadowing ->MPLPath

* use pathlib consistently in `metrics`

* use safe_resolve in export

* remove redundant defensive block for windows paths on python 3.6

* remove unused `get_immediate_subdirectories`

* use Path in plot_edge_affinity_distributions

* remove PTH enforcement in linting

* use safe_resolve instead of resolve in `training` and `auxiliaryfunctions`

* Update GUI assets import (#3370)

* Add GUI asset helper utilities

Introduce deeplabcut.gui.gui_assets module providing utilities to load bundled GUI assets. It locates the package assets directory via importlib.resources, and exposes resource_bytes, resource_text, get_assets_dir, get_style_qss, pixmap_from_resource and icon_from_resource helpers (using PySide6 QPixmap/QIcon). Includes error handling when image data cannot be loaded and uses type annotations for clarity.

* Use gui_assets for icons and pixmaps

Replace direct filesystem asset loading (BASE_DIR/assets and manual Path lookups) with centralized gui_assets helpers (icon_from_resource, pixmap_from_resource, get_style_qss/get_assets_dir) across multiple GUI modules. Updated imports and calls in components, launch_script, create_project, modelzoo, open_project, train_network, and window to use the new resource functions and remove redundant logo path handling, improving resource access and packaging robustness.

* fix path concatenation in `make_labeled_images_from_dataframe`

---------

Co-authored-by: Jaap de Ruyter van Steveninck <32810691+deruyter92@users.noreply.github.com>

* Adjust config path tests for Path objects

Update `test_auxiliaryfunctions.py` to assert `project_path` as a `pathlib.Path` instead of a string. The tests now cast to `str` only for the `"Volume{"` check, use `.exists()` for filesystem validation, and compare against `project_dir.absolute()` directly.

* Fix os import in safe_resolve

Import `os` inside `safe_resolve` before calling `os.listdir` so directory resolution no longer risks a `NameError`. This also removes an unused `os` import in `test_auxiliaryfunctions.py` and a stray blank line in `video_processor.py`.

* address remaining `.resolve()` cases: prefer `.absolute()`, or otherwise `safe_resolve()`

* update `safe_resolve`: add logging, use os.stat (more efficient)

* update test safe_resolve: allow fallback and test open/closing instead

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix remaining Path.resolve()

* fix reintroduced pathlib `resolve()` occurences (see #3349)

* use pathlib Path in GUI codebase

* use pathlib Path in memory replay

* GUI rename field `config` to `config_path`

* GUI use os.fspath for str conversions where required

* use pathlib Path in create_project

* use pathlib Path across pose_estimation_pytorch internally

* use centralized yaml dumper (which normalizes Path -> str)

* fix materialize.py downstream old str.split -> Path

* fix testsscripts str usage

* fix old str usage in  trainingsetmanipulation

* allow str type at TF boundary

* allow str formatting in tensorflow code

* fix config update in train_from_coco.py

PoseConfig.model.backbone is currently a dict-type but freeze_bn_stats were set as attribute. This commit fixes that and treats backbone correctly as dict.

---------

Co-authored-by: Cyril Achard <cyril.achard@epfl.ch>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request GUI issues relating to GUI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants