The old intro recommended Gooey and Tkinter Designer, which the 2026-10-02 audit removed; removing Gooey also dissolved the Wrappers subcategory. Co-Authored-By: Claude <noreply@anthropic.com>
5.4 KiB
Desktop apps with room to grow start on Qt, through PySide6. A small tool needs no third-party Python GUI library, since tkinter is in the standard library.
How to choose:
- A desktop app that will grow, even a closed-source one: PySide6
- A small tool, built with the standard library: tkinter
- GNOME apps, or anything else on GTK: PyGObject
- Fast, GPU-drawn tools and live plots: Dear PyGui
- Touch UIs that also run on Android and iOS: Kivy
- Native widgets on Windows, macOS, and Linux: wxPython
- Native widgets on desktop and mobile: Toga
- A Qt app under the GPL, or with a commercial license: PyQt6
- A modern look and dark mode for tkinter apps: CustomTkinter
- Your own HTML, CSS, and JavaScript in a desktop window: pywebview
- A pure Python UI in the browser or a desktop window: NiceGUI
- One Python codebase for desktop, mobile, and web: Flet
PySide6 is the official Python binding for Qt, under the LGPL, which lets your app's code stay closed as long as you meet its terms. Build the UI with Qt Widgets for an app that looks native, or with QML, which was first made for mobile apps and runs on desktop too. To lay out forms visually, draw them in Qt Widgets Designer, and pyside6-uic turns the .ui files into Python.
PyQt6 binds the same Qt, and PySide6 aims to be API compatible with PyQt, with some exceptions. The license is what splits them: PyQt6 is GPL or commercial, never LGPL, so with the GPL version your own code must use a compatible license.
tkinter is part of the standard library. Use the themed tkinter.ttk widgets, which adapt to each platform's native theme. Most tutorials online still teach the old API, so the docs point you to TkDocs, which teaches the modern one.
CustomTkinter widgets work like normal Tkinter widgets and mix with them, and they follow the system's light or dark mode.
PyGObject is the way to go for a GNOME app or any GTK app. Start with the GNOME Developer Documentation's beginner lessons. In code, subclass Gtk.Application and build your window in do_activate(), as the getting-started example does.
Dear PyGui is built on Dear ImGui and draws in immediate mode on your GPU, for scientific, engineering, and data science apps that need fast, interactive interfaces. Every main script runs the same steps: create the context and the viewport, set up, show the viewport, start, then destroy the context.
Kivy was built from scratch for multi-touch, and the same code runs on Windows, macOS, Linux, Android, and iOS. Subclass App and return your root widget from build(). As the UI grows, move it into the KV language, which separates your app's logic from its interface.
wxPython wraps the wxWidgets C++ library and, in most cases, uses each platform's native widgets. Its Hello World subclasses wx.Frame, puts the widgets on a wx.Panel, and lays them out with a sizer.
Toga uses native system widgets, not themes, on macOS, Windows, Linux, Android, and iOS. It's part of BeeWare, whose tutorial builds an app with Toga.
pywebview shows your HTML, CSS, and JavaScript in a native window. It doesn't bundle a GUI toolkit or web renderer, so a frozen app stays small. Point the window at a web server you already run, or call Python from JavaScript through its JS API bridge and serve static files from the built-in HTTP server.
NiceGUI keeps all UI logic in Python on a FastAPI backend and handles the web details for you. The UI shows up in your browser, or in a native desktop window.
Flet makes web, desktop, and mobile apps without HTML, CSS, or JavaScript, and builds them with Flutter. flet run opens your app in a desktop window, and flet run --web in the browser. As the app gets more interactive, its docs favor the declarative style, where the UI is derived from your app's state.