问题背景
python代码打包成exe可执行文件。问题是这个python程序执行时需要显示一张图片,这就意味着打包成exe后,也需要在exe同目录下存放这张图片,你的exe才能正常执行。而且不方便的是,我们把这款exe分享给别人用的时候,除了发这个exe之外,还需要发这张图片,这…有点鸡肋。想要直接一个exe发过去就能用。
问题背景来自我的另外一篇关于tkinter的博文中显示welcome图片
解决方案
使用base64把图片编码转换为一个字符串,把字符串放在代码里,要用的时候将字符串转换为图片显示出来。
- 什么是Base64编码?
- Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。**
- 步骤1:编码
这段代码用来生成对图片的base64编码
with open("D:\\welcome.png","rb") as f:
# 读取图片,并通过base64编码
base64_data = base64.b64encode(f.read())
# 将编码存在txt文件中
file=open('base64img.txt','wt')
file.write(str(base64_data))
file.close()
- 步骤2:复制编码写进我们要显示这张图片的程序里
本来是从本地读取,原来的代码是这样子的,这样子需要在本地存放图片
# 欢迎的图片显示
canvas = tk.Canvas(window, height=300, width=450)
image_file = tk.PhotoImage(file='welcome.png')
image = canvas.create_image(0, 0, anchor='nw', image=image_file)
canvas.pack(side='top')
将刚才生成并存放在base64img.txt的编码复制出来,作为字符串赋值给一个变量img_str,通过base64解码为图片,写在本地。这样即使你的本地没有这张图片,每次运行程序也会自动在本地生成这张图片,然后调用。修改后代码如下:
img_str = "这里编码太长了,我没写进来"
img_data = base64.b64decode(img_str)
with open('welcome.png', 'wb') as f:
f.write(img_data)
# 欢迎的图片显示
canvas = tk.Canvas(window, height=300, width=450)
image_file = tk.PhotoImage(file='welcome.png')
image = canvas.create_image(0, 0, anchor='nw', image=image_file)
canvas.pack(side='top')