Skip to main content

A powerful, .exe Desktop Application Python GUI framework built on top of PySide6.

Project description

PRs Welcome Python 3.9+ Component Driven Desktop App CLI Support Live Reload

Image Examples

image

image

image

WinUp 🚀

Make sure to download the Latest Stable Release (LSR) and not the latest/LFR! Current LSR: 2.4.8

pip install winup==2.4.8

A ridiculously Pythonic and powerful framework for building beautiful desktop applications.

WinUp is a modern UI framework for Python that wraps the power of PySide6 (Qt) in a simple, declarative, and developer-friendly API. It's designed to let you build applications faster, write cleaner code, and enjoy the development process.

Contributing


Why WinUp? (Instead of raw PySide6 or Tkinter)

Desktop development in Python can feel clunky. WinUp was built to fix that.

Feature WinUp Way ✨ Raw PySide6 / Tkinter Way 😟
Layouts ui.Column(children=[...]), ui.Row(children=[...]) QVBoxLayout(), QHBoxLayout(), layout.addWidget(), pack(), grid()
Styling props={"background-color": "blue", "font-size": "16px"} Manual QSS strings, widget.setStyleSheet(...), complex style objects.
State Management state.bind(widget, "prop", "key") Manual callback functions, getters/setters, StringVar(), boilerplate everywhere.
Two-Way Binding state.bind_two_way(input_widget, "key") Non-existent. Requires manual on_change handlers to update state and UI.
Developer Tools Built-in Hot Reloading, code profiler, and window tools out of the box. Non-existent. Restart the entire app for every single UI change.
Code Structure Reusable, self-contained components with @component. Often leads to large, monolithic classes or procedural scripts.

In short, WinUp provides the "killer features" of modern web frameworks (like React or Vue) for the desktop, saving you time and letting you focus on what matters: your application's logic.

🧊 WinUp vs 🧱 PyEdifice (Reddit User Request)

Feature WinUp PyEdifice
🧱 Architecture React-style + state React-style + state
🌐 Built-in Routing ✅ Yes (Router(routes={...})) ❌ No built-in routing
♻️ Lifecycle Hooks on_mount, on_unmount, etc. ⚠️ Limited (did_mount, etc.)
🎨 Theming / Styling System ✅ Global & Scoped themes ❌ Manual CSS injection
🔲 Layout Options ✅ Row, Column, Grid, Stack, Flexbox ⚠️ Mostly Box & HBox/VBox
🎞️ Animations ✅ Built-in (fade, scale, etc.) ❌ None built-in
🔁 Hot Reloading (LHR) ✅ Stable + fast (loadup dev) ⚠️ Experimental, limited support
📦 Packaging ✅ With LoadUp (PyInstaller-based) ❌ Must integrate PyInstaller manually
🧩 Component Reusability ✅ High, declarative ✅ High
🛠 Developer Tooling ✅ DevTools planned, Inspector soon ❌ None yet
📱 Mobile Support ❌ Not yet ❌ Not supported
🧠 Learning Curve ✅ Easy for Python+React users ✅ Easy but less tooling

✅ = Built-in or robust
⚠️ = Partial or limited
❌ = Missing entirely


Core Features

  • Declarative & Pythonic UI: Build complex layouts with simple Row and Column objects instead of clunky box layouts.
  • Component-Based Architecture: Use the @component decorator to create modular and reusable UI widgets from simple functions.
  • Powerful Styling System: Style your widgets with simple Python dictionaries using props. Create global "CSS-like" classes with style.add_style_dict.
  • Full Application Shell: Build professional applications with a declarative API for MenuBar, ToolBar, StatusBar, and SystemTrayIcon.
  • Asynchronous Task Runner: Run long-running operations in the background without freezing your UI using the simple @tasks.run decorator.
  • Performance by Default: Includes an opt-in @memo decorator to cache component renders and prevent needless re-computation.
  • Advanced Extensibility:
    • Widget Factory: Replace any default widget with your own custom implementation (e.g., C++ based) using ui.register_widget().
    • Multiple Windows: Create and manage multiple independent windows for complex applications like tool palettes or music players.
  • Reactive State Management:
    • One-Way Binding: Automatically update your UI when your data changes with state.bind().
    • Two-Way Binding: Effortlessly sync input widgets with your state using state.bind_two_way().
    • Subscriptions: Trigger any function in response to state changes with state.subscribe().
  • Developer-Friendly Tooling:
    • Hot Reloading: See your UI changes instantly without restarting your app.
    • Profiler: Easily measure the performance of any function with the @profiler.measure() decorator.
    • Window Tools: Center, flash, or manage your application window with ease.
  • Built-in Routing: Easily create multi-page applications with an intuitive, state-driven router.
  • Flexible Data Layer: Includes simple, consistent connectors for SQLite, PostgreSQL, MySQL, MongoDB, and Firebase.

Documentation

Dive deeper into the features of WinUp:

Core Concepts

Developer Tools

UI Components


Contributing

WinUp is an open-source project. Contributions are welcome!

License

This project is licensed under the MIT License. See LICENSE for more information.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

winup-2.4.8.tar.gz (60.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

winup-2.4.8-py3-none-any.whl (79.4 kB view details)

Uploaded Python 3

File details

Details for the file winup-2.4.8.tar.gz.

File metadata

  • Download URL: winup-2.4.8.tar.gz
  • Upload date:
  • Size: 60.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.5

File hashes

Hashes for winup-2.4.8.tar.gz
Algorithm Hash digest
SHA256 71f63c03d292435e0d69b5be95cea424238a64bcc26e924573cb3f4b780fc5f3
MD5 bcd2e5fc470a1d0b7ff09481060eb089
BLAKE2b-256 c0881847bca86f9923cf15fd4cb8f71d9ea0ce0faddcca4bf45ca3f2d3dca5c1

See more details on using hashes here.

File details

Details for the file winup-2.4.8-py3-none-any.whl.

File metadata

  • Download URL: winup-2.4.8-py3-none-any.whl
  • Upload date:
  • Size: 79.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.5

File hashes

Hashes for winup-2.4.8-py3-none-any.whl
Algorithm Hash digest
SHA256 21dbbe8718ab58303b08144c619f316e3d84a2c26e1db047679ed98feb63d7c5
MD5 8978a9a603edc5eba6dd4e31b6de81be
BLAKE2b-256 98d8d1377c5d58fd613dbc2ad395d29e24aee99d548f6eeab86c4f66089a39f1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page