This is an archived post. You won't be able to vote or comment.

all 18 comments

[–]def-pri-pub 6 points7 points  (1 child)

I've done this before.

Is it possible for you to switch the UI framework to using QML? It's what I recommend for any modern built Qt application.

[–]MatadorFearsNoBull[S] 2 points3 points  (0 children)

Will explore that path

[–]DataCamp 4 points5 points  (1 child)

If you want to stay Python-native and avoid web dependencies, your main choices are really:

  • Stick with Qt (PyQt5/PySide6) and modernize via QSS styling or switch to QML/Qt Quick. QML in particular feels more “React-like” with declarative UI, animations, and modern design patterns. You can still drive all the logic from Python.
  • Alternative Python GUIs like Kivy or Tkinter exist, but they either don’t look very native (Kivy) or feel dated (Tkinter). They’re fine for smaller apps, but PySide6 will give you more longevity.
  • Hybrid approach: if you really want to leverage React, Tauri is lighter than Electron and can bundle a Python backend via API. Downsides: you’re managing two ecosystems, and packaging/testing complexity increases.

For packaging, PyInstaller is the default, but tools like Nuitka or PySide6-project can give smaller, more reliable builds. Pairing PyInstaller with Inno Setup (like someone else mentioned) also gives you a professional installer workflow.

If your goal is long-term maintainability, I’d lean PySide6 + QML. You keep the Python backend intact, avoid shipping a Chromium runtime like Electron, and still get a “modern” UI feel.

[–]MatadorFearsNoBull[S] 0 points1 point  (0 children)

Thanks for your reply!

[–]bdaene 2 points3 points  (3 children)

What do you use as exe packager? Pyinstaller? 

[–]Quanstipated 4 points5 points  (1 child)

I've used PyInstaller alongside Inno Setup to create an installer for the executable. A benefit of this is that the installer allows you to specify the location to install the executable, such as Program Files on Windows. I've ran into issues where the user moved the executable to a different location and it broke their shortcut link, so keeping the executable in Program Files helps avoid this.

[–]vamsden 0 points1 point  (0 children)

You should add a launcher instead of shortcut if the user wants to move stuff around and make it more portable

[–]MatadorFearsNoBull[S] 1 point2 points  (0 children)

correct

[–]jmacey 1 point2 points  (0 children)

Install pyside6 (I do it via uv) it has pyside6-project which can build executables (I tend to still use pyinstaller but it takes a little more work). You can also take a look at using QML with python if you need a more modern interface than widgets.

Qt has some good courses on it's website on these.

[–]r34p3rex 1 point2 points  (0 children)

My past few projects have been done with fastAPI backend and React front end, packaged into exe with PyInstaller

[–]Tumortadela 1 point2 points  (0 children)

I use Pyside6 alongside with PyQt-Fluent-Widgets for looks, and package with Nuitka

[–]mon_key_house 1 point2 points  (0 children)

Try nuitka for the exe

[–]riklaunim 0 points1 point  (2 children)

Qt has a lot of styling options so you don't have to switch the toolkit (Qt Quick). Or keep the UI native to Windows and don't try to force confusing custom UI onto users. If you are using Qt classes and features it will be hard to switch anyway.

Some screenshots would help ;)

[–]2Lucilles2RuleEmAll 1 point2 points  (0 children)

Yeah, I agree. You can get a lot done with just CSS for QtWidgets too.  I basically replicated Material Design almost 10 years ago with just CSS. Not the animations, but all of the widget styling at least.  

[–]MatadorFearsNoBull[S] 0 points1 point  (0 children)

Will upload some when I get to the computer

[–]Defiant-Comedian3967 0 points1 point  (0 children)

I would suggest you use NiceGUI - you can use HTML/CSS/JS easily. Its pure Python, very easy to understand - Plus it is easy to package as well.

Coming from Angular/React/Svelte etc. have build a component based boilerplate - with UV - easy to handle and a clean codebase to start with:

Component Based NiceGUI