Building desktop apps with PySide6 is honestly super fun — until you reach that final boss:
“How do I turn this into an actual EXE or Linux binary?”
So here’s my personal notebook entry on how I packaged my PySide6 app (Simdoro) into a clean distributable for Windows (and Linux too).
Raw, simple, and straight from my dev flow.
🚀 Why this guide exists
I was building a small productivity tool with PySide6. The Python part was easy.
Shipping it? Not so much.
Most tutorials were either outdated, too complex, or straight-up confusing.
So, here’s the real world, dev-friendly, no jargon version of how I actually built my installer.
✅ What you need installed
Before running anything:
- Python (3.10+ recommended)
- A virtual environment (always a good idea)
- PySide6
- PyInstaller (for EXE builds)
- Optional: cx_Freeze (for MSI installers)
Inside your project:
myapp/
│─ classes/
│─ helpers.py
│─ pomo.py
│─ sounds.py
│─ icon.ico
│─ sound.mp3
Pretty standard setup.
🪟 Packaging for Windows (EXE)
✅ Method 1 — PyInstaller (the fastest way)
If you’re using PowerShell / CMD:
pyinstaller ^
--noconfirm ^
--onefile ^
--windowed ^
--name Simdoro ^
--icon icon.ico ^
--collect-submodules PySide6 ^
--collect-data PySide6 ^
--collect-binaries PySide6 ^
--add-data "sound.mp3;." ^
--add-data "classes;classes" ^
pomo.py
If you’re in Git Bash (MINGW64):
pyinstaller \
--noconfirm \
--onefile \
--windowed \
--name Simdoro \
--icon icon.ico \
--collect-submodules PySide6 \
--collect-data PySide6 \
--collect-binaries PySide6 \
--add-data 'sound.mp3;.' \
--add-data 'classes;classes' \
pomo.py
✅ After running it:
dist/Simdoro.exe
And that’s it — a clean portable EXE.
📦 Bonus: MSI Installer (Windows) If you want a real installer (Add/Remove Programs, Start Menu, etc.): Install:
pip install cx-Freeze
Create setup.py:
from cx_Freeze import setup, Executable
build_exe_options = {
"packages": ["PySide6"],
"include_files": [
"icon.ico",
"sound.mp3",
"classes",
],
}
setup(
name="Simdoro",
version="0.1.0",
description="Simple PySide6 Pomodoro App",
options={"build_exe": build_exe_options},
executables=[Executable("pomo.py", base="Win32GUI", icon="icon.ico")],
)
Build MSI:
python setup.py bdist_msi
Installer goes into:
dist/Simdoro-0.1.0.msi
🐧 Packaging for Linux Linux builds are actually easier:
pyinstaller \
--noconfirm \
--onefile \
--windowed \
--name simdoro \
pomo.py
The output is a single binary under:
dist/simdoro
If you want a .deb or .rpm package, tools like fpm or appimage-builder can do that — but honestly, the single binary works great for small utilities.