0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何将Python GUI程序打包成EXE可执行文件

Geehy极海半导体 来源:21ic论坛极海半导体专区 2025-12-16 09:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。

1. 为什么要做GUI与打包EXE

更友好、更直观

如果我们给同事展示一个命令行,他们可能会有点“吓人”的感觉,担心忘记或输错参数。而一个 UI 界面则是一目了然,“选择固件→点击下载”这样的流程几乎零学习成本。

无需安装Python

经常在产线或测试环境中,电脑系统可能很久不会升级,也没有装Python。要想让他们去装Python+库依赖,就比较麻烦。而如果能打包成EXE,所有Python解释器、第三方模块都内置其中,对外只需要双击文件即可启动GUI。一旦配置好,就可以在任何Windows机器上复用。

可延伸的封装思路

有了GUI后,我们还可以更进一步添加“固件版本管理”“设备自动识别”“烧写统计”等功能,把它变成一个灵活的产线工具。

2. 实现GUI的思路与技术选型

在Python里做GUI并不复杂,一般常见选项是

Tkinter(Python 标准库自带,轻量基础)

PyQt/PySide(功能强大,界面美观,但相对体量大)

wxPython、Kivy等其他选项

对于“简单的产线烧写工具”来说,Tkinter足够胜任,所以本篇使用Tkinter 作演示。

3. 设计功能需求:“又简单又够用” 为了在界面上实现基本的烧写操作,我们梳理了下面几项功能:

1. 选择自定义脚本:用户可以选择自定义脚本,因为G32R501核心DCS功能需要特定的脚本进行KEY写入,这个我们需要关注。

2.选择固件:用户能通过文件对话框,选择.hex或.bin格式固件。

3.擦除操作:一键擦除Flash,让G32R501的存储空间干净如新。

4.下载操作:把选定的固件文件下载到目标芯片中,并可通过进度提示或成功/失败信息告诉用户结果。

5.仿真器识别:如果电脑插着多个调试器或多个板子,可以列出来让用户选。

4. 代码层级:分文件设计

以下是示例代码,思路供参考。我们可以根据项目规模或个人习惯决定是否拆分成多个.py文件。这里分拆成若干功能模块,好处是层次更清晰,也便于后续维护。

4.1 文件结构概览 假设我们有个目录PyOCDDownloadToolGUI,内部结构大概是:

PyOCDDownloadToolGUI/

├─ main.py # 程序入口 - 启动GUI、Tkinter界面逻辑

├─ download_operation.py # 下载功能

├─ erase_operation.py # 擦除功能

├─ file_selector.py # 打开文件对话框

├─ get_debuggers.py # 获取当前CMSIS-DAP设备列表

└─ get_supported_targets.py # 获取当前pyocd支持芯片列表

4.2 核心代码演示

下面我们聚焦主要内容,展现部分代码,以下两段代码演示了如何调用 pyocd 的命令行。

4.2.1 erase_operation.py(擦除功能)

"""

实现对目标芯片的全擦除函数erase_chip()。

若用户勾选了自定义脚本路径,则在命令行中附加 --script=<脚本路径>。

"""

import subprocess

import sys

def erase_chip(target_name, user_script=None):

"""

Perform chip erase using pyOCD command.

- target_name: e.g. 'g32r501dxx'

- user_script: path to user script, or None if not used

Return the command output for logging or error info.

"""

cmd = ["pyocd", "erase", "--chip", "--target", target_name]

if user_script:

cmd.append(f"--script={user_script}")

try:

if sys.platform.startswith("win"):

# Windows专用

si = subprocess.STARTUPINFO()

si.dwFlags |= subprocess.STARTF_USESHOWWINDOW

si.wShowWindow = 0 # 0 对应 SW_HIDE

result = subprocess.run(

cmd,

startupinfo=si,

capture_output=True,

text=True,

check=False

)

else:

result = subprocess.run(

cmd,

capture_output=True,

text=True,

check=False

)

return result.stdout + result.stderr

except Exception as e:

return f"Error executing erase_chip: {e}"

4.2.2 download_operation.py (下载功能)

"""

实现下载固件函数 download_firmware(),

针对 .bin 文件可附加 --format bin 和 --base-address 参数;

针对 .hex 文件则直接 pyocd load -t

"""

import subprocess

import sys

def download_firmware(target_name, file_path, file_type, user_script=None, base_address=None):

"""

Download firmware to target chip using 'pyocd load'.

- target_name: e.g. 'g32r501dxx'

- file_path: absolute path of the firmware

- file_type: 'bin' or 'hex'

- user_script: if not None, specify '--script=xxx'

- base_address: for .bin format, required if user wants to specify

Return the command output for logging.

"""

cmd = ["pyocd", "load", "-t", target_name]

# If user_script is specified

if user_script:

cmd.append(f"--script={user_script}")

# If it's bin, add extra options

if file_type == "bin":

cmd.extend(["--format", "bin"])

# If user provided base address

if base_address is not None:

cmd.extend(["--base-address", str(base_address)])

# Finally, add the firmware file path

cmd.append(file_path)

try:

if sys.platform.startswith("win"):

# Windows专用

si = subprocess.STARTUPINFO()

si.dwFlags |= subprocess.STARTF_USESHOWWINDOW

si.wShowWindow = 0 # 0 对应 SW_HIDE

result = subprocess.run(

cmd,

startupinfo=si,

capture_output=True,

text=True,

check=False

)

else:

result = subprocess.run(

cmd,

capture_output=True,

text=True,

check=False

)

return result.stdout + result.stderr

except Exception as e:

return f"Error executing download_firmware: {e}"

最终启动效果:

183fb958-d1c3-11f0-8c8f-92fbcf53809c.png

5. 打包成EXE:PyInstaller“一键搞定”

这是本篇文章最重要的部分:如何把这个GUI打包成一个单独可执行文件。

5.1 为什么选用PyInstaller

使用简单:只需写一个spec文件,或者直接pyinstaller xxx.py就能包装出dist文件夹。

依赖收集:它会自动收集.py文件、第三方依赖、.dll文件等,打包到一起。

常规方案:是Python社区里最常见、成熟度高的打包工具之一。

5.2 PyInstaller打包步骤

(1) 命令行打包GUI

只需在命令行(在main.py同级目录下启动)中执行以下命令:

pyinstaller --onefile --noconsole --name PyOCDDownloadToolGUI main.py

命令解释:

--onefile:生成一个单文件 EXE,启动时会自解压到临时目录里。

--noconsole:不弹出额外的命令行窗口,让界面更干净;如果想看调试信息,可以去掉此参数。

--name PyOCDDownloadToolGUI:指定生成的 EXE 文件名;如省略则默认与脚本同名。

main.py:我们的 GUI 入口脚本。

执行完该命令后,PyInstaller 会在当前目录下生成一个 dist 文件夹,里面就有 PyOCDDownloadToolGUI.exe。

(2) 打包 PyOCD 本身

PyOCD也带有pyocd.exe命令行工具。如果我们把它也打包到和PyOCDDownloadToolGUI.exe同一目录,下次就可以不再额外安装pyocd或python。

打包方法如下:

1. 从GitHub(https://codeload.github.com/pyocd/pyOCD/zip/refs/tags/v0.37.0)下载pyOCD的源码压缩包 (例如v0.37.0)。

2. 解压后,在根目录找到pyocd.py和pyocd.spec文件。

3. 将这两个文件复制到我们已经完成了G32R501适配工作的本地pyocd所在目录的父目录里(注意:这个目录与pyocd同级,而不是放到它的子目录下)。比如默认Python的site-packages路径:

C:Users<用户名>AppDataLocalProgramsPythonPython312Libsite-packagespyocd

4. 在存放pyocd.spec的目录启动cmd,输入命令:

pyinstaller pyocd.spec

5. 打包完成后,会在dist文件夹下生成一个针对pyocd的可执行文件及其相关资源。

6. 运行与演示

当我们完成打包后,distPyOCDDownloadToolGUI下会出现PyOCDDownloadToolGUI.exe。

把这整个文件夹 + 我们打包好的pyocd.exe文件夹,拷贝到一台没有Python的Windows 电脑上,插上G32R501开发板 + 调试器,直接双击 PyOCDDownloadToolGUI.exe,理论上就能弹出我们的烧写GUI。

试着点击“Download/Erase/Verify”按钮,即可正常工作。

注:文章作者在原帖中提供了代码文件,有需要请至原文21ic论坛

原文地址:https://bbs.21ic.com/icview-3467862-1-1.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 烧写
    +关注

    关注

    0

    文章

    59

    浏览量

    14820
  • GUI
    GUI
    +关注

    关注

    3

    文章

    694

    浏览量

    42904
  • python
    +关注

    关注

    57

    文章

    4860

    浏览量

    89647

原文标题:APM32芯得 EP.67 | G32R501与PyOCD的进阶应用:一键GUI+打包EXE,让烧写更优雅

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【实用开发工具】BAT脚本打包成exe可执行文件

    【实用开发工具】BAT脚本打包成exe可执行文件
    的头像 发表于 08-21 19:51 2.8w次阅读
    【实用开发工具】<b class='flag-5'>将</b>BAT脚本<b class='flag-5'>打包成</b><b class='flag-5'>exe</b><b class='flag-5'>可执行文件</b>

    写好的LabView程序怎么生成可执行文件

    写好的LabView程序怎么生成可执行文件,客户端只要安装可执行文件就能操作运行了,
    发表于 12-17 10:51

    LabView生成可执行文件EXE

    LabView生成可执行文件EXE时,运行时出现ERROR8,创建暂时的LVSB资源文件是什么意思啊?????
    发表于 04-11 13:45

    关于生成可执行文件的问题

    生成了一个可执行文件,在打开.exe文件时,出现了如图所示的错误,请问该怎么处理?
    发表于 01-29 16:19

    python文件如何打包成exe可执行文件

    python文件打包成exe可执行文件前言  也许我们不一定是专业的程序员,但是我们仍然可以通过
    发表于 07-06 06:34

    程序exe可执行文件的运行过程

    语法错误和逻辑错误2. 创建源程序的过程2.1 编辑源程序2.2编译源程序(1) 编译器MASM2.3 连接连接的作用2.4 简化编译、连接过程2.5 exe
    发表于 01-07 08:05

    LabVIEW可执行文件作为后台进程运行

    是Application.exe ,其中Application.exe可执行文件的名称。HideRootWindow = True添加到.ini
    发表于 03-18 21:15

    K510跑python的opencv可行吗?打包为linux可执行文件能跑吗?

    想了解一下K510跑python的opencv可行吗?打包为linux可执行文件能跑吗?
    发表于 09-14 09:01

    用MDK生成bin格式的可执行文件

    用MDK 生成bin 文件1用MDK 生成bin 文件Embest 徐良平在RV MDK 中,默认情况下生成*.hex 的可执行文件,但是当我们要生成*.bin 的可执行文件时怎么办呢
    发表于 08-02 10:52 71次下载

    基于LabVIEW的可执行文件调用的研究与实现

    LabVIEW 是美国NI 公司推出的一种基于G 语言的虚拟仪器软件开发工具。在LabVIEW 开发的软件中,用户可能需要调用.exe 可执行文件。本文结合实例详细介绍了三种调用方法:通过Call
    发表于 08-14 11:42 66次下载

    了解在Linux下可执行文件格式

    Linux下面,目标文件、共享对象文件可执行文件都是使用ELF文件格式来存储的。程序经过编译之后会输出目标
    发表于 05-15 08:49 2255次阅读

    CCES创建可执行文件的操作流程

    本模块介绍用CrossCore® Embedded Studio (CCES)创建可执行文件的整个流程。涉及的主题包括使用新项目向导、配置系统和工具选项,以及构建过程。
    的头像 发表于 07-11 06:06 4142次阅读

    Python如何将Python脚本打包成exe可执行文件

    Python实用技巧】如何将Python脚本打包成exe可执行文件
    的头像 发表于 08-18 12:40 1.9w次阅读
    【<b class='flag-5'>Python</b>】<b class='flag-5'>如何将</b><b class='flag-5'>Python</b>脚本<b class='flag-5'>打包成</b><b class='flag-5'>exe</b><b class='flag-5'>可执行文件</b>

    labview生成可执行程序后vi都在同一路径下吗

    打包成一个单独的可执行文件或安装程序,这些VI和资源文件在内部被组织和引用,而不是作为单独的物理文件存放在
    的头像 发表于 09-04 17:06 1811次阅读

    labview怎么生成可执行文件

    生成可执行文件EXE)是LabVIEW程序开发中的一个重要步骤,它允许用户LabVIEW项目打包成一个独立的应用
    的头像 发表于 09-04 17:07 2531次阅读