Qt for Python & Briefcase#
Briefcase 是一个打包工具,允许您为 Python 应用程序创建独立的打包。它支持以下安装程序格式
macOS 的
.app
应用程序包Windows 的 MSI 安装程序
Linux 的 AppImage
有关更多详细信息,请参阅 官方文档。
Qt 6 支持
截至 2021 年 3 月,Qt 6 尚不支持。
截至 2021 年 3 月,Qt 6 尚不支持。
准备
使用以下 pip 命令安装 Briefcase
pip install briefcase
您还需要:Linux 上的 docker,Windows 上的 WixToolset,
如果您正在使用虚拟环境,请记住在安装 Briefcase
之前激活它。
安装完成后,briefcase
二进制文件位于您的虚拟环境 bin/
目录中,或与您的 Python 可执行文件所在的目录相同。
您可以使用 briefcase 助手创建一个全新的项目,或者设置自己的项目。
使用以下 pip 命令安装 Briefcase
pip install briefcase
您还需要:Linux 上的 docker,Windows 上的 WixToolset,
如果您正在使用虚拟环境,请记住在安装 Briefcase
之前激活它。
安装完成后,briefcase
二进制文件位于您的虚拟环境 bin/
目录中,或与您的 Python 可执行文件所在的目录相同。
您可以使用 briefcase 助手创建一个全新的项目,或者设置自己的项目。
使用 Briefcase 助手
运行以下命令并回答问题以开始操作
briefcase new
确保选择 GUI 工具包选择 为 PySide6。您的 PySide6 应用程序现在已经配置好了。您可以跳转到 构建包。
运行以下命令并回答问题以开始操作
briefcase new
确保选择 GUI 工具包选择 为 PySide6。您的 PySide6 应用程序现在已经配置好了。您可以跳转到 构建包。
设置您的项目
创建 pyproject.toml
在您的项目根目录中创建一个 pyproject.toml
文件
[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 = "[email protected]"
[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 = []
编写一些代码
假设您的项目结构如下
pyproject.toml
setup.cfg
pytest.ini
src/
mypysideapp/
resources/
appicon.png
appicon.ico
__init__.py
__main__.py
app.py
__main__.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())
app.py
的内容
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))
创建 pyproject.toml
在您的项目根目录中创建一个 pyproject.toml
文件
[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 = "[email protected]"
[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 = []
pyproject.toml
文件[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 = "[email protected]"
[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 = []
编写一些代码
假设您的项目结构如下
pyproject.toml
setup.cfg
pytest.ini
src/
mypysideapp/
resources/
appicon.png
appicon.ico
__init__.py
__main__.py
app.py
__main__.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())
app.py
的内容
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))
pyproject.toml
setup.cfg
pytest.ini
src/
mypysideapp/
resources/
appicon.png
appicon.ico
__init__.py
__main__.py
app.py
__main__.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())
app.py
的内容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))
构建包
初始化包
只需运行
briefcase create
运行以下命令来初始化为 Windows、Linux 和 macOS 构建包。它为不同平台创建了一个子目录。此步骤会花费更长的时间,因为它在 pyproject.toml
文件的 requires
节中添加了包。
构建应用
briefcase build
您将获得
macOS/A Cool App/A Cool App.app
or
linux/A Cool App-x86_64-0.0.1.AppImage
or
windows\A Cool App
运行应用
briefcase run
注意
您可以使用 briefcase dev
在 dev
模式下运行您的项目(源代码未打包)
搭建安装包(仅限 Windows 和 macOS)#
macOS
briefcase package --no-sign
可以在文档中找到签名方法,请参考文档。您将得到macOS/A Cool App-0.0.1.dmg
Windows
briefcase package
您将得到 windows\A_Cool_App-0.0.1.msi
初始化包
只需运行
briefcase create
运行以下命令来初始化为 Windows、Linux 和 macOS 构建包。它为不同平台创建了一个子目录。此步骤会花费更长的时间,因为它在 pyproject.toml
文件的 requires
节中添加了包。
briefcase create
pyproject.toml
文件的 requires
节中添加了包。构建应用
briefcase build
您将获得
macOS/A Cool App/A Cool App.app
or
linux/A Cool App-x86_64-0.0.1.AppImage
or
windows\A Cool App
briefcase build
macOS/A Cool App/A Cool App.app
or
linux/A Cool App-x86_64-0.0.1.AppImage
or
windows\A Cool App
运行应用
briefcase run
注意
您可以使用 briefcase dev
在 dev
模式下运行您的项目(源代码未打包)
briefcase run
注意
您可以使用 briefcase dev
在 dev
模式下运行您的项目(源代码未打包)
搭建安装包(仅限 Windows 和 macOS)#
macOS
briefcase package --no-sign
可以在文档中找到签名方法,请参考文档。您将得到macOS/A Cool App-0.0.1.dmg
Windows
briefcase package
您将得到 windows\A_Cool_App-0.0.1.msi