一、简介
我们写完一个程序,一般都是封装后给用户使用,因为有些用户机台环境不满足py文件的执行,重新安装较为麻烦。
程序封装命令如下:
- 封装为.exe文件,运行时带有cmd黑框(xxx.py表示将要封装的程序)
pyinstaller -F xxx.py
- 封装为exe文件,运行未带cmd黑框
pyinstaller -F -w xxx.py
但是GUI程序基本都带有图片资源,还按这样方式封装后运行会直接报错,因为图片没有封装上
。
注:py文件在window系统封装都是”.exe“文件。
二、GUI程序封装流程
-
将图片放入”resources“文件夹中,然后运行py文件确保程序无异常(”resources“文件夹名字为任意命名的);
-
【创建spec文件】由于本次的程序打包需要进行resources资源引用,所以必须手工的在打包配置文件之中进行资源路径定义, 就需要根据打包程序生成有一个"*.spec"文件;
如图是待打包程序
注:这里将图片已放入resources目录下,然后执行如下步骤:
(1) 用cmd命令切换窗口切换至gui目录下;
(2) 运行命令pyi-makespec -F demo.py
,会产生如下提示,代表创建spec文件创建成功。
-
在待打包的py文件中修改部分代码;
原demo.py文件如下:
from tkinter import *
root = Tk()
textlabel = Label(root,text='一个窗口,\n哈哈!', #支持\n换行
justify=LEFT, #表示文字左对齐
padx=20) #表示边距为20
textlabel.pack(side=LEFT) #自动排放,side=LEFT为排放在左边
#显示图片,图片支持gif
photo = PhotoImage(file='./resources/001.gif')
imglabel = Label(root,image=photo)
imglabel.pack(side=RIGHT) #自动排放,side=RIGHT为排放在右边边
mainloop()
修改后的py文件
from tkinter import *
import os
def get_resource_path(relative_path):
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath('.')
return os.path.join(base_path, relative_path)
logo_path = get_resource_path(os.path.join('resources', '001.gif'))
root = Tk()
textlabel = Label(root,text='一个窗口,\n哈哈!',
justify=LEFT,
padx=20)
textlabel.pack(side=LEFT)
#显示图片,图片支持gif
photo = PhotoImage(file=logo_path)
imglabel = Label(root,image=photo)
imglabel.pack(side=RIGHT)
mainloop()
- 修改【demo.spec】文件定义要使用的资源路径;
将datas=[],
修改为datas=[("resources","resources")],
- 在cmd命令框中运行
pyinstaller -F demo.spec
;
- 然后在dist文件中即可找到封装后的exe文件,那么在其他机台上使用就不需要带图片运行了。