# Python 版 APP
本文介绍 Python 版 APP 开发流程。
# 创建 APP 工程
# 准备好开发环境
| 开发环境 | 版本号 | 说明 |
|---|---|---|
| Syslab(推荐) | 2023b | 集成开发环境 |
| Python | 3.7.5 | 解释器 |
| PyQt5 | 5.12.3 | Python 版 Qt 包 |
| pyqt5-tools | 5.12.3 | Qt 工具,如 Qt Designer、Liguist 等 |
| PyQtChart | 5.12.0 | Python 版 QtChart 包 |
| pyinstaller | 5.1 | 将工程打包为可执行文件 |
| PYQT Integration | V0.2.0 | 插件 |
Syslab
Python APP 开发建议使用 Syslab,也可以选择 PyCharm 等其他集成开发环境,软件安装方法请参考相关说明。
Python
Syslab2023a 内置了 Python3.7.5 环境,无需安装即可直接使用。
如果需要其他版本的 Python,请在 Python 官网进行下载安装,地址为:Python 官网 (opens new window)
依赖包安装
确保已经安装完成 Python 后,需要进行 APP 开发的依赖包安装。
(1) 打开命令行终端
打开 Syslab 软件,选择当前工作目录后,单击终端界面中右上角的图标 + 的下拉列表,新建 Command Prompt 终端。

(2) 检查依赖包安装情况
请输入以下指令查看内置的 Python 是否已默认安装依赖的 PyQt5、pyqt5-tools、PyQtChart、pyinstaller 第三方包。
>pip list(3) 安装 PyQt5
请注意 PyQt5、pyqt5-tools 和 PyQtChart 的版本需一致,以免出现不兼容的情况,这里采用推荐的 5.12.3 版本进行安装,建议使用国内镜像进行下载:
>pip3 install PyQt5==5.12.3 -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com(4) 安装 pyqt5-tools
>pip3 install pyqt5-tools==5.12.3.1.6rc1 -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com(5) 安装 PyQtChart
>pip3 install PyQtChart==5.12.0 -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com(6) 安装 pyinstaller
>pip3 install pyinstaller==5.1 -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.comPYQT Integration 插件
(1) 安装“PYQT Integration”插件
在 Syslab 界面中,单击左侧侧边栏中的“扩展图标”(形如四方块的图标),在顶部搜索框中输入“PYQT Integration”,然后选择该插件,单击安装。

(2) 配置“PYQT Integration”插件
完成 PYQT Integration 插件安装后,需要进行参数配置。在“扩展: PYQT Integration”界面中单击插件卡片下方的形如齿轮的设置图标按钮,弹出选择菜单,在菜单中选择扩展设置。
在设置页面中插件需要配置三个路径。其中的“Python 解释器位置”为在此例中为C:\Users\Public\TongYuan\.julia\miniforge3\Scripts。- Pyrcc:Cmd
Python 解释器位置\pyrcc5- Pyuic:Cmd
Python 解释器位置\pyuic5- Qtdesigner:Path
Python 解释器位置\pyqt5designer
配置完成后的界面如下图所示。

# 新建 Qt 图形应用工程
创建 Qt UI 文件
安装好插件后,在资源管理器中右击,选择 PYQT: New Form 打开 Qt Designer 软件。

以 Python 版 CurveFitTool 为例,进一步开发 UI 界面,UI 界面的开发方法在此不做说明。开发好的 UI 界面效果如下图所示:

以上界面交互中,Data 数据部分需要从 Syslab 工作区获取数组类型的变量名列表,以及通过变量名获取变量值;Export 导出部分需要将计算结果写入 Syslab 工作区;Results 输出拟合后的表达式;Curve 区域绘制二维曲线图。
将此 UI 文件保存为
curve_fit_main_win.ui。创建资源文件
在同一文件夹中新建
Resource.qrc文件,输入以下内容:<RCC> <qresource prefix="/CurveFitTool"> <file>logo.ico</file> </qresource> </RCC>其中
logo.ico为 APP 图标文件,需要放在同一文件夹下。编译 UI 和资源文件
在 Syslab 中创建完成 UI 和资源文件后,需要调用pyuic和pyrcc进行编译生成.py格式的文件。选中需要编译的资源文件,右击弹出右键菜单,选择菜单栏中的 PYQT: Compile Resource,将自动生成名为文件名_rc.py的文件。生成后的命名格式可以在“PYQT Integration”中进行设置。
同理,选中需要编译的 UI 文件,右击弹出右键菜单,选择菜单栏中的 PYQT: Compile From,将自动生成名为Ui_文件名.py的文件。创建主窗口
使用 QMainWindow 类创建主窗口对象。
curve_fit_main_win.pyfrom PyQt5.QtWidgets import QApplication, QMainWindow from Ui_curve_fit_main_win import * from Ui_export_select_dlg import * class CurveFitMainWin(QMainWindow, Ui_CurveFitMainWin): def __init__(self,parent =None): super().__init__(parent) # 调用父类构造函数,创建窗体 self.ui = Ui_CurveFitMainWin() # 创建UI对象 self.ui.setupUi(self) # 构造UI界面 # …
# APP开发与集成
# 使用 Python AppSdk
SyslabAPPSdk 是负责与 Syslab 平台通信交互的 SDK,SyslabAPPSdk 可以在路径:<Syslab 安装路径>\Examples\10 APPDemos\python\py_syslab_app_sdk下找到,将py_syslab_app_sdk文件夹拷贝到 Qt 工程目录下。
完成 py_syslab_app_sdk 包的拷贝后,导入 SyslabAPPSdk 包,就可在工程中使用相关接口。导入 SyslabAPPSdk 包的示例代码如下:
from py_syslab_app_sdk.syslab_app_sdk import SyslabAppSdk
from py_syslab_app_sdk.variable_info import VariableInfo
# 传递 APP 启动参数
Syslab 平台启动 APP 程序时,会传递给 APP 进程以下启动参数:
argv[0]:用于调用程序的命令;
argv[1]:管道名,由 Syslab 平台生成后传递给 APP;
argv[2~3]:Julia 相关路径参数,由 Syslab 平台生成后传递给 APP;
argv[4~]:由用户在 APP 启动函数中输入。
以 Python 版 CurveFitTool 为例,在文件curve_fit_main_win.py中的__main__启动函数中负责解析这些参数,其中管道名是必须解析的,Julia 参数和其他参数 APP 可以按需解析和使用。示例代码如下:
# 与 Syslab 平台集成后,自动获取管道名
if len(sys.argv) > 1 and "--pipe=" in sys.argv[1]:
pipe_name = sys.argv[1].replace("--pipe=", "")
main_window.set_pipe_name(pipe_name)
# 用户自定义启动参数举例:获取多项式系数
if len(sys.argv) > 4:
qstr_term = str(sys.argv[4])
main_window.set_term(qstr_term)
以管道名参数为例,解析后的管道名要传递给 QMainWindow 的实现类 CurveFitMainWin,用以创建命名管道客户端。在 CurveFitMainWin 类中新增函数set_pipe_name(),示例代码如下:
curve_fit_main_win.py def set_pipe_name(self, pipe_name): if self.m_syslab_sdk == None: self.m_syslab_sdk = SyslabAppSdk("CurveFitTool", pipe_name) self.slot_update_syslab_var()
其他参数以类似的方法可以传递给 CurveFitMainWin,在此不再赘述。
SyslabAPPSdk 主要提供以下接口:
获取变量列表
查询变量值
发送脚本到 Syslab 执行
关闭命名管道
下文将讲述这些接口的具体使用方法。
# 获取变量列表
def mw_get_variables(show_modules: bool) -> (list | Literal[False])
| 功能 | 获取 Syslab 工作区变量列表 |
|---|---|
| 参数 | show_modules:是否显示模块列表,一般为 False |
| 返回值 | False-失败 变量列表-成功 |
CurveFitTool 中调用该接口的示例代码如下:
curve_fit_main_win.py
variables = []
if self.m_syslab_sdk:
variables = self.m_syslab_sdk.mw_get_variables(False)
for var in variables:
if r"Vector{Int64}" in var.get_type() or r"Vector{Float64}" in
var.get_type():
self.ui.comboBox_x.addItem(var.get_name())
self.ui.comboBox_y.addItem(var.get_name())
# 获取变量值
def mw_get_value(var_name: str) -> (str | Literal[False])
| 功能 | 获取工作区变量值 |
|---|---|
| 参数 | var: 变量名,可以为子变量 a.b |
| 返回值 | 变量值字符串-成功 False-失败 |
CurveFitTool 中调用该接口的示例代码如下:
value = self.m_syslab_sdk.mw_get_value(str(name))
str_value = str(value)
var_lst = str_value[1:-1].split(",")
datas = []
for var_str in var_lst:
datas.append(float(var_str))
# 运行脚本
def mw_run_script(code: str,
show_code_in_repl: bool,
show_result_in_repl: bool) -> (str | Literal[False])
| 功能 | 在 syslab 工作区执行 Julia 脚本代码 |
|---|---|
| 参数 | code: 要运行的 Julia 脚本 show_code_in_repl: 是否在 Syslab REPL 中显示代码 show_result_in_repl: 是否在 Syslab REPL 中显示结果 |
| 返回值 | code 运行后的结果-成功 False-失败 |
CurveFitTool 中调用该接口的示例代码如下:
curve_fit_main_win.py
if dlg.is_export_res():
str_res_name = dlg.get_res_name()
str_res_data = str(self.m_res_datas)
str_script = f"{str_res_name}={str_res_data}"
self.m_syslab_sdk.mw_run_script(str(str_script), None, None)
调用 Syslab 的数学 API 进行曲线拟合计算的示例代码如下,第一步计算曲线拟合参数:
str_script = f"impor TyMathCore;
temp_coeffi,temp_s = TyMathCore.polyfit(cdate, pop, {int_n})"
self.m_syslab_sdk.mw_run_script(str_script, False, False)
str_coeffi = self.m_syslab_sdk.mw_get_value("temp_coeffi")
第二步计算曲线拟合结果:
str_script = f"import TyMathCore; temp_results = TyMathCore.polyval(temp_coeffi, cdate)"
self.m_syslab_sdk.mw_run_script(str_script, False, False)
str_res = self.m_syslab_sdk.mw_get_value("temp_results")
# 关闭命名管道
def close_pipe() -> None
| 功能 | 发送请求,关闭命名管道,在关闭程序前调用 |
|---|---|
| 参数 | 无 |
| 返回值 | 无 |
在关闭 APP 前,需要调用一次上述关闭命名管道接口,与 Syslab 平台断开连接。CurveFitTool 中调用该接口的示例代码如下:
curve_fit_main_win.py
def closeEvent(self, event):
if self.m_syslab_sdk:
self.m_syslab_sdk.close_pipe()
event.accept()
到此为止,曲线拟合工具开发过程中要调用 SDK 的接口都已经讲完了,剩下的就是具体的业务逻辑代码开发。
该示例 Demo 的源代码,可以在 Syslab 安装软件以下路径获取到:<Syslab 安装路径>\Examples\10 AppDemos\python\。
# APP测试
# 打桩测试
以曲线拟合 APP 为例,该 APP 在运行时从 Syslab 平台获取数据后,进行曲线拟合计算,对 Syslab 平台有依赖。测试时为了解除对 Syslab 平台的依赖,可以通过打桩 mock 的方式,构造打桩数据,独立验证 APP 自身的功能。
打桩测试部分代码如下: curve_fit_main_win.py
global_is_mock = True
def slot_update_syslab_var(self):
variables = []
if global_is_mock:
var1 = VariableInfo("cdata", "Vector{Float64}")
var2 = VariableInfo("pop", "Vector{Float64}")
variables.append(var1)
variables.append(var2)
elif self.m_syslab_sdk:
variables = self.m_syslab_sdk.mw_get_variables(False)
# 其他代码…
def get_mock_datas(self, var_name):
if var_name == "cdata":
return "[1790,1800,1810,1820,1830,1840,1850,1860," \
"1870,1880,1890,1900,1910,1920,1930,1940," \
"1950,1960,1970,1980,1990]"
elif var_name == "pop":
return "[3.9,5.3,7.2,9.6,12.9,17.1,23.1,31.4,38.6," \
"50.2,62.9,76.0,92.0,105.7,122.8,131.7," \
"150.7,179.0,205.0,226.5,248.7]"
else:
return ""
# 代码省略…
# 与 Syslab 平台集成调试
示例中的管道名需要在与 Syslab 平台集成后,才能在启动 APP 时自动获取。如果您要在开发过程中对 APP 进行调试,请按照以下步骤手动设置命名管道地址。
- 启动管道服务端
在 Syslab 中的 Julia REPL 终端中运行以下指令启动管道服务(新建 Julia REPL 终端时自动开启):
VSCodeServer.start_app_pipe_server()
true
- 获取 Syslab 平台命名管道地址
VSCodeServer.app_pipe_name`
\\\\.\\pipe\\app-pipe-09cba4da-d3c5-4430-a89b-b18fcce3278f
- 在 APP 的
__main__启动函数中添加临时代码,设置上一步得到的命名管道地址,并注释自动获取管道名相关代码
if __name__ == "__main__":
app = QApplication(sys.argv) # 创建GUI应用程序
main_window = CurveFitMainWin() # 创建主窗体
main_window.show() # 显示主窗体
# 与 Syslab 平台集成后,自动获取管道名
# if len(sys.argv) > 1 and "--pipe=" in sys.argv[1]:
# pipe_name = sys.argv[1].replace("--pipe=", "")
# main_window.set_pipe_name(pipe_name)
# 用户自定义启动参数举例:获取多项式系数
# if len(sys.argv) > 4:
# qstr_term = str(sys.argv[4])
# main_window.set_term(qstr_term)
# 与 Syslab 平台集成调试
pipe_name = "\\\\.\\pipe\\app-pipe-09cba4da-d3c5-4430-a89b-b18fcce3278f"
main_window.set_pipe_name(pipe_name)
sys.exit(app.exec_())
- 单击 Syslab 主页菜单栏中的启动调试图标,进行 APP 调试
# 集成测试
APP 开发和打包完成后,参考 APP 安装使用的内容,完成 APP 的集成测试。
# APP 打包
PyQt5 的打包工具选择为 pyinstaller,它会自动检测和收集应用程序所需的所有依赖项,并将它们打包到生成的可执行文件中。命令的语法如下:
pyinstaller [options] script [script …] | specfile
具体的使用详情可参考此链接:pyinstaller (opens new window)
在终端中输入以下指令,完成软件打包。
pyinstaller -n CurveFitTool curve_fit_main_win.py
打包完成后,会在同级目录下生成一个dist文件夹,文件夹中包含有名为CurveFitTool.exe的 APP。此外,如果需要国际化,请将翻译后的.qm文件拷贝在CurveFitTool.exe的同级目录中,最终打包完成的文件夹如图所示。
