GUI Development

Libraries for working with graphical user interface applications.

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

Listed in editorial order, grouped by use case. Click a column header to re-sort the whole list.

Press / to search. Tags open their category. Click a row for details.

Search and filter

Results

Row number Tags

Desktop 5 projects

Python bindings for GLib/GObject/GIO/GTK.
GNOME/github.com/GNOME/pygobject /160 stars /
A simple GPU-accelerated Python GUI framework.
hoffstadt/github.com/hoffstadt/DearPyGui /15,653 stars /
An open-source cross-platform GUI framework for desktop, mobile, and embedded devices.
kivy/github.com/kivy/kivy /19,030 stars /
A cross-platform GUI toolkit that wraps the wxWidgets C++ library.
wxWidgets/github.com/wxWidgets/Phoenix /2,631 stars /
A Python-native, OS-native GUI toolkit.
beeware/github.com/beeware/toga /5,425 stars /

Qt 2 projects

Qt for Python offers the official Python bindings for Qt, largely API-compatible with PyQt6 but with different licensing.
pyside/github.com/pyside/pyside-setup /135 stars /
Python bindings for the Qt cross-platform application and UI framework.

Tkinter 2 projects

(Python standard library) The standard Python interface to the Tcl/Tk GUI toolkit.
A modern and customizable Python UI library based on Tkinter.

Web-based 3 projects

A lightweight cross-platform native wrapper around a webview component.
r0x0r/github.com/r0x0r/pywebview /6,144 stars /
An easy-to-use, Python-based UI framework, which shows up in your web browser.
zauberzeug/github.com/zauberzeug/nicegui /16,330 stars /
Cross-platform GUI framework for building modern apps in pure Python.
flet-dev/github.com/flet-dev/flet /17,470 stars /

GUI Development guide

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.

Know a project that belongs here?

Tell us what it does and why it stands out.