欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

pyinstaller 把 py 打包成 exe , image文件 在exe里面 示例 通义 有大用

理解您的需求,您想通过PyInstaller将Python脚本打包成EXE时,希望图像文件能够内嵌到EXE文件中,而不是作为外部独立文件存在。这样做的好处是可以使最终的可执行文件更加自包含,便于分发。不过,PyInstaller本身并不直接支持将图像等资源文件完全“内嵌”到EXE中成为不可见部分,但它可以确保这些资源与EXE一起被打包,并在运行时正确访问。

基本方法

上面已经提到了如何使用--add-data来确保图像文件随EXE一同被打包,并且能够在程序内部通过正确的路径访问。但若要实现“内嵌”效果,即让最终用户感觉不到图像文件的存在,您可以采取一种变通的方法:在程序运行前,将图像数据读入内存,然后按需使用。这样,即便图像文件物理上与EXE分离,从用户体验角度来说,它们也是“内嵌”的。

示例代码调整

假设您想展示的图片是example.jpg,我们可以先将其转换为二进制数据存储在程序中,然后在需要时再将这部分数据转换回图像显示。

步骤1: 将图像转换为Base64编码

首先,您需要将图片文件转换为Base64编码字符串,这样就可以直接在Python脚本中作为字符串存储了。这个步骤可以在打包前手动完成,有很多在线工具可以帮助您做这个转换。

步骤2: 修改Python脚本

接下来,修改您的Python脚本以使用内嵌的Base64字符串来显示图像。

Python
1import os
2import base64
3from io import BytesIO
4from PIL import Image
5import tkinter as tk
6from tkinter import ttk
7
8def convert_base64_to_image(b64_data):
9    return Image.open(BytesIO(base64.b64decode(b64_data)))
10
11def show_image_from_base64(root, b64_data):
12    image = convert_base64_to_image(b64_data)
13    photo = tk.PhotoImage(image=image)
14    label = ttk.Label(root, image=photo)
15    label.image = photo  # keep a reference to prevent garbage collection
16    label.pack()
17
18# 这里是假设的Base64编码字符串,请替换为您实际的Base64图片数据
19base64_image_data = "iVBORw0KGg...(省略,此处应放置Base64编码的图片数据)"
20
21root = tk.Tk()
22show_image_from_base64(root, base64_image_data)
23root.mainloop()

步骤3: 使用PyInstaller打包

现在,您不再需要使用--add-data来包含图像文件,因为图像数据已经作为字符串嵌入到了脚本中。直接使用PyInstaller打包即可,例如:

Bash
1pyinstaller --onefile --windowed main.py

注意事项

  • 这种方法增加了程序的启动时间和内存占用,因为图像数据需要在每次运行时解码。

  • 对于非常大的图像文件,这种方法可能不是最理想的解决方案。

  • 确保Base64编码的图像数据不会让您的脚本变得难以维护。

通过这种方法,尽管图像数据并未物理上“内嵌”到EXE文件中,但从用户的角度看,程序是自包含的,不需要额外的外部文件。


普通分类: