Changelog

We're regularly updating the site with new tutorials, updates and corrections with the support of the Python community.

Found something wrong? Send Feedback & Corrections

What does @Slot() do?

Is the Slot decorator even necessary?

Packaging Tkinter applications for Windows with PyInstaller & InstallForge

Turn your Tkinter application into a distributable installer for Windows

Opening New Windows from Qt Designer Files in PyQt6

How to properly use Qt Designer generated UI files and open new windows with button clicks

Displaying Tabular Data in PySide2 ModelViews

Create customized table views with conditional formatting, numpy and pandas data sources.

Widget size and placement in the tabs of a QTabWidget

How to control widget positioning in tab layouts using addStretch

Programmatically select multiple rows in QTableView

Use QItemSelection and QItemSelectionModel to highlight multiple rows in a QTableView from code

Updating PyQt6 Widgets from Functions and Classes

How to get data back into your labels and widgets instead of just printing to the console

Laying Out Your PyQt5 GUIs With Qt Designer

Use Qt Designer to effortlessly build your application UI

Raindar — Desktop Weather App with Python

Build a weather app by pulling data from a remote API using PyQt5

7Pez, custom skinned Unzip

Skinning a PyQt5 decorationless window

Create Applications with QtQuick in PySide6

Build modern applications with declarative QML

PySide6 Dialogs and Alerts

Notify your users and ask for their input

How to Create a Filter/Search Bar for a QTableView in PyQt5

Use QSortFilterProxyModel to add live filtering to your tables

PySide6 Signals, Slots & Events

Triggering actions in response to user behaviors and GUI events

Creating your first app with PyQt6

A simple Hello World! application with Python and Qt6

PySide6 Toolbars & Menus — QAction

Defining toolbars, menus, and keyboard shortcuts with QAction

PySide6 Layouts

Use layouts to effortlessly position widgets within the window

PyQt6 Dialogs and Alerts

Notify your users and ask for their input

Creating your first app with PySide6

A simple Hello World! application with Python and Qt

PySide6 Widgets

Using QPushButton, QCheckBox, QComboBox, QLabel, QSlider and more widgets in your Python GUI apps

Creating your first app with PySide2

A simple Hello World! application with Python and Qt

PySide2 Toolbars & Menus — QAction

Defining toolbars, menus and keyboard shortcuts with QAction

PySide2 Layouts

Use layouts to effortlessly position widgets within the window

PySide2 Dialogs and Alerts

Notify your users and ask for their input

PySide2 Signals, Slots & Events

Triggering actions in response to user behaviors and GUI events

PySide2 Widgets

Using QPushButton, QCheckBox, QComboBox, QLabel and QSlider widgets

PyQt5 Dialogs and Alerts

Notify your users and ask for their input

Creating your first app with PyQt5

A simple Hello World! application with Python and Qt5

Install PyQt5 on Windows

Install PyQt5 on Windows 8, 10 & 11

Install PySide2 on Windows

Install PySide2 on Windows 8, 10 & 11

Install PyQt5 on Ubuntu Linux

Install PyQt5 on Ubuntu and other Debian-based Linux distributions

Install PyQt5 on macOS

Step-by-step guide to installing PyQt5 on macOS for Python GUI development

Keeping Your Main Window Open After Closing a Dialog in PyQt6

Why your app closes when you dismiss a dialog, and how to fix it

Change color in QProgressBar delegate

How to dynamically change QProgressBar colors in a QTableView delegate

Passing Arguments to Threaded Functions in PyQt6

Understanding the difference between passing a function and calling a function when using QThreadPool and QRunnable

Getting a Value from a Model Using Row-Column Indices

How to retrieve data from a Qt model using row and column integers

When will there be a new version of Creating GUI Applications for PyQt6 and PySide6?

Key migration changes from PyQt5/PySide2 to PyQt6/PySide6 and the updated book editions

How to compile PyQt5 or PySide2 code with Nuitka

Convert your Python Qt applications to fast native executables using the Nuitka compiler

Creating a database data entry form with PyQt5

Using SQL table models and QDataWidgetMapper to build automatic data entry views

Using Complex Data Sources with PyQt6 Model/View Architecture

How to use JSON, nested data, and other complex structures in your Qt table and list views

Changing Ticks in PyQtGraph Objects to Strings

How to replace numeric axis ticks with custom labels like month names or dates in PyQtGraph

Dynamically Adding Rows of Widgets in PyQt6

How to use QGridLayout to add multiple widgets per row at runtime

Clean up on exit — Stopping threads when closing a PyQt6 application

How to properly shut down background threads and workers when your application window is closed

Fixing Crashes When Using NumPy Arrays with QImage in Qt Threads

How to safely pass image data between threads when streaming video or updating displays

How to Check if a QLineEdit is Empty in Python

Empty strings are falsey in Python

Are there any built-in QIcons?

Using built-in icons for your apps.

Understanding QPainter Coordinates in PyQt6

How the coordinate system works for drawing on canvases in PyQt6