用Python写一个Mac程序

2022/1/16

大象放冰箱分三步,python写Mac程序分四步。

截屏2022-01-16 下午9.35.44

PyQT5介绍

QT是一个C++图像用户界面库,被芬兰的一家公司拥有,而PyQT5是QT的python版本,封装了大量的Python接口,超过6000个函数和方法,PyQT5可以运行在多个平台,另外,目前信创行业国产操作系统麒麟V10,桌面端很多应用都是基于PyQT5写的。PyQT5特性如下:

  • 基于高性能的Qt的GUI控件集。
  • 能够跨平台运行在Linux、Window和Mac OS系统上。
  • 使用信号槽机制进行通信。
  • 对Qt库进行完全封装。
  • 可以使用成熟的IDE进行界面设计,并自动生成可执行的Python代码。
  • 提供一整套种类齐全的窗口控件。

主要模块包括如下:

  • QtCore:包含了核心的非 GUI 的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime 类文件、进程与线程一起使用。
  • QtGui:包含了窗口系统、事件处理、2D 图像、基本绘画、字体和文字类。
  • QtWidgets:包含了一系列创建桌面应用的 UI 元素。
  • QtMultimedia:包含了处理多媒体的内容和调用摄像头 API 的类。
  • QtBluetooth:包含了查找和连接蓝牙的类。
  • QtNetwork:包含了网络编程的类,这些工具能让 TCP/IP 和 UDP 开发变得更加方便和可靠。
  • QtPositioning:包含了定位的类,可以使用卫星、WiFi 甚至文本。
  • Enginio:包含了通过客户端进入和管理 Qt Cloud 的类。
  • QtWebSockets:包含了 WebSocket 协议的类。
  • QtWebKit:包含了一个基 WebKit2 的 web 浏览器。
  • QtWebKitWidgets:包含了基于 QtWidgets 的 WebKit1 的类。
  • QtXml:包含了处理 xml 的类,提供了 SAX 和 DOM API 的工具。
  • QtSvg:提供了显示 SVG 内容的类,Scalable Vector Graphics (SVG) 是一种是一种基于可扩展标记语言 (XML),用于描述二维矢量图形的图形格式(这句话来自于维基百科)。
  • QtSql:提供了处理数据库的工具。
  • QtTest:提供了测试 PyQt5 应用的工具。

PyQT5安装

pip install pyqt5  (核心包)
pip install pyqt5-tools  (UI设计工具 Qt Designer)

PyQT5配置

为什么要配置,先看一下开发一个PyQT程序的步骤:

  • 编写UI文件(使用Qt Designer设计),xml格式文件
  • 将UI文件转换成python文件(需要通过配置的工具进行转换)
  • 编辑python文件和其他业务逻辑代码

我们使用的IDE是PyCharm,配置方法File – Settings – Tools – External Tools,打开对话框,点击+号,依次增加QtDesigner,PyUIC,PyRCC三个扩展工具(以下program路径需要根据各自安装的路径来修改)。

QtDesigner

name: QtDesigner
Program: /Users/yangchangming/PythonProject/windows-demo/venv/lib/python3.6/site-packages/qt5_applications/Qt/bin/Designer.app
Working directory: $FileDir$

PyUIC

name: PyUIC
Program: /Users/yangchangming/PythonProject/windows-demo/venv/bin/pyuic5
Arguments: -x $FileName$ -o $FileNameWithoutExtension$.py
Working directory: $FileDir$

PyRCC

name: PyRCC
Program: /Users/yangchangming/PythonProject/windows-demo/venv/bin/pyrcc5
Arguments: $FileName$ -o $FileNameWithoutExtension$_rc.py
Working directory: $FileDir$

Qt Designer

通过Designer设计UI,配置好后,双击存在的UI文件会打开编辑器,即可拖拽式进行UI设计,并可以快速查看设计效果,最终生成*.ui文件(实质上是XML格式的文件),可直接使用,然后通过PyUIC直接转为python文件即可,转换完成后可以直接编辑。
截屏2022-01-16 下午7.20.29

在PyCharm中打开ui文件,并作为激活页面,然后点击Tools中External Tools中的PyUIC菜单,即执行命令进行转换,转为同名的python文件。命令如下:

/Users/yangchangming/PythonProject/windows-demo/venv/bin/pyuic5 -x auto-layout-window.ui -o auto-layout-window.py

转换后的UI Python文件可以直接执行,但是一般情况下都需要结合实际业务逻辑代码来启动UI,通常写法是通过第三方来调动UI类,并进行UI的初始化,如下:

class Loader(QMainWindow):

def __init__(self, parent=None):
    super(QMainWindow, self).__init__(parent)
    self.ui = LDCP_UI()
    self.ui.setupUi(self)

打包MAC应用

利用FBS来打包程序,fbs是一个打包工具,可以将python程序打包成exe,mac,linux下的安装包,先安装fbs,如下命令:

pip install fbs

生成fbs工程骨架,在当前工程所在目录命令行使用命令fbs startproject,即可生产fbs工程的骨架,包括如下目录:
截屏2022-01-16 下午10.19.27

该工程目录中包括了生成各个平台所需的资源文件和配置文件,比如icon,windows下的安装包路径,以及各个平台下的配置文件。将原先写的python文件copy至src - main - python下。修改启动类代码,加入fbs应用上下文类。

from fbs_runtime.application_context.PyQt5 import ApplicationContext

if __name__ == '__main__':
appctxt = ApplicationContext()       # 1. Instantiate ApplicationContext
loaderApp = loader.Loader()
loaderApp.show()
exit_code = appctxt.app.exec_()      # 2. Invoke appctxt.app.exec_()
sys.exit(exit_code)

在命令行执行fbs freeze,即可打包生成所在平台的应用程序包。