#Desktop
20 posts
Build a Desktop App with PySide6 #7: Packaging and Distribution — Building Executables with PyInstaller
Bundle the app with PyInstaller so it runs on computers without Python installed. The onedir vs onefile trade-off, including data files, platform-specific caveats, and pyside6-deploy — the final part of the series.
Build a Desktop App with PySide6 #6: Threads and Timers — Keeping the UI Responsive
See exactly why wiring a long task to a button freezes the whole window, then fix it with the QThread + Worker pattern — the canonical code that keeps the UI responsive. Also covers QTimer for periodic work.
Build a Desktop App with PySide6 #5: Model/View — Connecting Data to Lists and Tables
We hit the limits of stuffing data directly into widgets and move to Qt model/view. Subclassing QAbstractTableModel, change notification, a QSortFilterProxyModel search filter, and selection handling — all practiced on a todo table.
Build a Desktop App with PySide6 #4: Qt Designer and UI Files — Draw the Screen, Then Load It
Draw your screen with Qt Designer, which ships with PySide6, and load the .ui file in two ways: pyside6-uic and QUiLoader. We practice the code-and-screen separation workflow on the todo app form.
Build a Desktop App with PySide6 #3: Signals and Slots — the Core of Event Handling
A tour of signals and slots, the center of event handling in Qt. From clicked.connect through signals that carry arguments to custom signals declared with Signal, and wiring real behavior into the todo app.
Build a Desktop App with PySide6 #2: Widgets and Layouts — Assembling the Screen
A catalog of the widgets you will use most, and how to assemble a real screen by nesting QVBoxLayout and QHBoxLayout. We build the screen skeleton of the todo app we will extend throughout the series.
Build a Desktop App with PySide6 #1: What PySide6 Is — Desktop Apps with Qt and Python
A comparison of your options for building desktop apps in Python, and the case for PySide6, the official Qt bindings. We go from installation to showing your first window and understanding what the event loop means.
Wails in Practice #10 Finishing Touches — Settings, Dark Mode, Data Backup
The final post of the series. Features are all there, but we fill in the touches that make the app worth reopening. Covers a structure for saving and loading settings, dark mode that follows the system, remembering window state, backup/export/import that keeps user data safe, and a recap of the principles running through all ten posts.
Wails in Practice #7 The Note Editor for Real — Markdown Preview and List UX
The first post of Part 2. We actually build the front half of the notes app, backend-heavy so far. Covers a preview that renders markdown safely, debounced autosave that fires when typing stops, keeping edits from shuffling the list order, and a list UX you can move through with the keyboard.
Wails in Practice #5 Signing and Notarization — How a Shipped App Earns Trust
Make the finished notes app run without warnings on other people's machines. Covers why an unsigned app is blocked by macOS Gatekeeper and Windows SmartScreen, the macOS code-signing and notarization (notarytool) procedure, the types and cost of Windows code-signing certificates, and what to know before handing this process to CI.
Wails in Practice #4 Tray Residence and a Global Shortcut — Capture Fast from the Background
Turn the notes app into a background app that stays alive after the window closes. Covers the fact that Wails v2 has no built-in tray and how to work around it, changing window close from quit to hide, implementing a global shortcut to capture a new note from anywhere, and how v3's built-in tray changes this.
Building Desktop Apps with Wails #8 Debugging — Dev Tools, Logs, Common Errors
Gathers the spots beginners get stuck on most. Covers opening the WebView dev tools during development, reading logs on both the frontend and Go sides, diagnosing a built app with -debug, and the causes and fixes for common errors like a blank screen, binding not found, and a nil context.