一.Python中的图片打包
1.经过科学搜索后有以下几种打包方式:
①将图片转化为py文件中的变量,通过import该文件来生成需要的图片,使用后移除图片
(该方法可以通过库base64和wxpython实现)
②将图片放在同一目录下的文件夹中,随程序一起使用
③使用工具对exe文件和图片进行二次打包
可能还有其他方式,在此只列取这几种
2.本人比较懒,选择的是较为方便好看的第一种方式,其他方式就不讨论了:
①base64
将图片转化为base64编码的py文件中的变量
import base64
def pic2py(picture_name):
open_pic = open("%s" % picture_name, 'rb')
b64str = base64.b64encode(open_pic.read())
open_pic.close()
# 注意这边b64str一定要加上.decode()
write_data = 'img = "%s"' % b64str.decode()
f = open('%s.py' % picture_name.replace('.', '_'), 'w+')
f.write(write_data)
f.close()
if __name__ == '__main__':
name = input("你想转化的图片的完整文件名:")
pic2py(name)
#使用方式如下
'''
from in_ico import img
...
tmp = open('in.ico', 'wb')
tmp.write(base64.b64decode(img))
tmp.close()
#使用图片
os.remove('in.ico')
'''
②wxpython
安装wxpython库后,在命令框中使用命令:
python img2py.py -n = 引用图片名(含格式) -i = 生成py文件名(含.py)
得到一个py文件,图片已转化为该文件中的一个二进制编码的变量,通过类似上一种方法中的使用方法,解码后即可使用
二.pyinstaller中的spec文件
1.可以在官网了解一下
简单介绍:
通过pyi-makespec name.py命令来生成一个自定义的spec文件
# -*- mode: python -*-
block_cipher = None
a = Analysis(['name.py'],
pathex=['D:\\ME'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='name',
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='name')
spec文件分为Analysis, pyz, exe, coll四个部分
①Analysis:首先是需要打包的py文件,通过一个字符串列表储存;然后是py文件的路径;datas是需要引用的文件(图片等)
②exe:要生成exe文件时,name是exe文件的名字, console是是否在打开exe文件时打开命令框
③coll:收集前三个部分的内容进行整合
pyinstaller通过最开始生成的spec文件进行打包,也可以自定义spec文件后,使用pyinstaller -F name.spec命令来打包
2.打包后的spec文件
如果使用了--add-data命令后, 在Analysis中的datas中出现引用的图片的名称;使用-i 命令后,在exe在最后会出现icon = 图标名。
注意:使用--add-data命令时,使用方式如:--add-data 图片名;位置(同一目录下可以用.)
该命令可以打包使用绝对路径引用的图片,但一旦通过该路径找不到图片时即会报错(如在其他电脑上打开exe文件,原路径上图片删除或转移)