Qt for Python & Briefcase#
Briefcase is a packaging tool that lets you create a standalone package for a Python application. It supports the following installer formats:
.appapplication bundle for macOS
MSI installer for Windows
AppImage for Linux
For more details, see the official documentation.
Status of Qt 6 Support#
As of March 2021, Qt 6 is not supported yet.
Briefcase using the following pip command:
pip install briefcase
You also need : docker on linux, WixToolset on windows,
If you’re using a virtual environment, remember to activate it before installing
After installation, the
briefcase binary is located in your virtual environment’s
directory, or where your Python executable is located.
You can either create a brand new project using the briefcase assistant or setup your own.
Use Briefcase Assistant#
Run the following command and answer the questions to get started:
Ensure that PySide6 is chosen as the GUI toolkit choice. Your PySide6 application is now configured. You can jump to Build the package.
Set up your project#
Create a pyproject.toml#
At the root level of your project, create a
[tool.briefcase] project_name = "MyPySideApp" bundle = "com.example" version = "0.0.1" url = "https://somwhere/on/the/net" license = "GNU General Public License v3 (GPLv3)" author = 'MyName Firstname' author_email = "firstname.lastname@example.org" [tool.briefcase.app.mypysideapp] formal_name = "A Cool App" description = "The coolest app ever" icon = "src/mypysideapp/resources/appicon" # Briecase will choose the right extension depending the os (png,ico,...) sources = ['src/mypysideapp'] requires = ['pyside6==6.0.0', 'pony>=0.7.11,<0.8', 'dickens==1.0.1', 'Pillow==7.1.2', 'mako==1.1.2', 'beautifulsoup4'] [tool.briefcase.app.mypysideapp.macOS] requires =  [tool.briefcase.app.mypysideapp.linux] requires =  system_requires =  [tool.briefcase.app.mypysideapp.windows] requires = 
Write some code#
Let’s say your project tree is like this:
pyproject.toml setup.cfg pytest.ini src/ mypysideapp/ resources/ appicon.png appicon.ico __init__.py __main__.py app.py
import sys from PySide6.QtWidgets import QApplication from mypysideapp.app import MyWidget if __name__ == "__main__": app = QApplication(sys.argv) widget = MyWidget() widget.resize(800, 600) widget.show() sys.exit(app.exec())
import random from PySide6.QtWidgets import (QLabel, QPushButton, QVBoxLayout, QWidget) from PySide6.QtCore import Slot, Qt class MyWidget(QWidget): def __init__(self): QWidget.__init__(self) self.hello = ["Hallo Welt", "你好，世界", "Hei maailma", "Hola Mundo", "Привет мир"] self.button = QPushButton("Click me!") self.text = QLabel("Hello World") self.text.setAlignment(Qt.AlignCenter) self.layout = QVBoxLayout() self.layout.addWidget(self.text) self.layout.addWidget(self.button) self.setLayout(self.layout) # Connecting the signal self.button.clicked.connect(self.magic) @Slot() def magic(self): self.text.setText(random.choice(self.hello))
Build the package#
Initialize the package#
Run the following command to initialize the building the packages for Windows, Linux, and macOS.
It creates a subdirectory each for the different platforms.
This step takes longer as it adds the packages listed in
requires sections in the
Build the application#
macOS/A Cool App/A Cool App.app or linux/A Cool App-x86_64-0.0.1.AppImage or windows\A Cool App
Run the application#
You can run your project in
dev mode (your source code not packaged) with
Build the installer (only Windows and macOS)#
briefcase package --no-sign
It’s possible to sign, see the
macOS/A Cool App-0.0.1.dmg