2026a

# 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 插件
  1. Syslab

    Python APP 开发建议使用 Syslab,也可以选择 PyCharm 等其他集成开发环境,软件安装方法请参考相关说明。

  2. Python

    Syslab2023a 内置了 Python3.7.5 环境,无需安装即可直接使用。

    如果需要其他版本的 Python,请在 Python 官网进行下载安装,地址为:Python 官网 (opens new window)

  3. 依赖包安装

    确保已经安装完成 Python 后,需要进行 APP 开发的依赖包安装。

    (1) 打开命令行终端

    打开 Syslab 软件,选择当前工作目录后,单击终端界面中右上角的图标 + 的下拉列表,新建 Command Prompt 终端。 新建的终端4

    (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.com

  4. PYQT Integration 插件

    (1) 安装“PYQT Integration”插件

    在 Syslab 界面中,单击左侧侧边栏中的“扩展图标”(形如四方块的图标),在顶部搜索框中输入“PYQT Integration”,然后选择该插件,单击安装。 安装PYQT Integration插件4

    (2) 配置“PYQT Integration”插件

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

    • Pyrcc:Cmd

    Python 解释器位置\pyrcc5

    • Pyuic:Cmd

    Python 解释器位置\pyuic5

    • Qtdesigner:Path

    Python 解释器位置\pyqt5designer

配置完成后的界面如下图所示。 插件设置界面配置4

# 新建 Qt 图形应用工程

  1. 创建 Qt UI 文件

    安装好插件后,在资源管理器中右击,选择 PYQT: New Form 打开 Qt Designer 软件。 打开软件4

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

    以上界面交互中,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 图标文件,需要放在同一文件夹下。

  2. 编译 UI 和资源文件
    在 Syslab 中创建完成 UI 和资源文件后,需要调用pyuicpyrcc进行编译生成.py格式的文件。选中需要编译的资源文件,右击弹出右键菜单,选择菜单栏中的 PYQT: Compile Resource,将自动生成名为文件名_rc.py的文件。生成后的命名格式可以在“PYQT Integration”中进行设置。 编译资源文件4 同理,选中需要编译的 UI 文件,右击弹出右键菜单,选择菜单栏中的 PYQT: Compile From,将自动生成名为Ui_文件名.py 的文件。

  3. 创建主窗口

    使用 QMainWindow 类创建主窗口对象。

    curve_fit_main_win.py

    from 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 进行调试,请按照以下步骤手动设置命名管道地址。

  1. 启动管道服务端

在 Syslab 中的 Julia REPL 终端中运行以下指令启动管道服务(新建 Julia REPL 终端时自动开启):

VSCodeServer.start_app_pipe_server()
true
  1. 获取 Syslab 平台命名管道地址
VSCodeServer.app_pipe_name`

\\\\.\\pipe\\app-pipe-09cba4da-d3c5-4430-a89b-b18fcce3278f
  1. 在 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_())
  1. 单击 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的同级目录中,最终打包完成的文件夹如图所示。 文件夹4