pip install winup==2.5.7
For the old way which doesn't use component based platform rendering see here, for the new component based rendering way see here.
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.
WinUp now also supports building fully interactive, stateful web applications using the same Python-centric, component-based approach. The web module uses FastAPI and WebSockets under the hood to bring the simplicity of WinUp to the browser.
Disclaimer: Web support is an optional feature. To use it, you must install the web dependencies:
pip install winup[web]
Contributing Changelog License
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.
| 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. |
did_mount, etc.) |
| π¨ Theming / Styling System | β Global & Scoped themes | β Manual CSS injection |
| π² Layout Options | β Row, Column, Grid, Stack, Flexbox | |
| ποΈ Animations | β Built-in (fade, scale, etc.) | β None built-in |
| π Hot Reloading (LHR) | β
Stable + fast (loadup dev) |
|
| π¦ 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
- Declarative & Pythonic UI: Build complex layouts with simple
RowandColumnobjects instead of clunky box layouts. - Component-Based Architecture: Use the
@componentdecorator 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 withstyle.add_style_dict. - Full Application Shell: Build professional applications with a declarative API for
MenuBar,ToolBar,StatusBar, andSystemTrayIcon. - Asynchronous Task Runner: Run long-running operations in the background without freezing your UI using the simple
@tasks.rundecorator. - Performance by Default: Includes an opt-in
@memodecorator 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.
- Widget Factory: Replace any default widget with your own custom implementation (e.g., C++ based) using
- 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().
- One-Way Binding: Automatically update your UI when your data changes with
- 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.
Dive deeper into the features of WinUp:
- Getting Started
- Component Model & Styling
- Cross-Platform Component Decorator
- State Management
- Routing
- Absolute Positioning (Advanced)
- CLI Commands Reference
- Live Hot Reload (LHR)
- Performance Profiler
- Memoization
- Async Task Runner
- Tailwind Support
WinUp is an open-source project. Contributions are welcome!
This project is licensed under the MIT License. See LICENSE for more information.


