引言
之所以会有这个文章,是因为之前写的好多应用被使用pyintaller
打包成exe后,在打开到弹出应用界面时需要一定的时间,如果应用稍微复杂一些或者电脑性能较差,这个时间就可能会很长,如果在这段时间没有什么能表示现在应用已经在运行的消息,这可能会让使用者以为应用没打开,这很不利于应用的正确使用。为此我一开始想的是提高应用的运行速度,看到网上说可以使用Nuitka
代替pyinstaller
进行打包,所以我就花了很多时间研究怎么使用Nuitka
打包,发现这个工具是真的难用,使用老版本(0.6.X
)时,编译时确实是快一点,但是还需要在编译后一个个的把缺少的模块给找出来,而且在我的一个应用编译时,里面使用了matplotlib
的qtbackend,结果无论使用什么方法,最后都会报错。而使用新版本(1.0.3
)时,变异过程是真的慢,一个很普通的应用(使用pyintaller
打包成exe后大概有90M),但是用Nuitka
打包时耗时估计有3个小时,简直了!!!不过打包成功后运行速度确实是快了,而且打包了之后一般不用像老版本那样会缺少模块,但是这个打包时间真是不能接受。虽然Nuitka
打包比pyintaller
打包后的结果加密性更好,但是目前我还没有较强的加密需求,所以Nuitka
打包不是很合适。而且有些应用即使使用Nuitka
打包后,运行速度快了,但是从点击exe到弹出应用界面还是需要时间的,虽然Nuitka
打包也可以加闪屏,但是好像使用MinGW
进行编译时是不能添加闪屏的,所以还是不行。
后面在查询的过程中,发现现在pyintaller
提供了一个给应用添加闪屏的命令,而且还可以在闪屏图上添加当前应用解压的过程,这样在点击exe后,会立马弹出闪屏,然后在闪屏上显示当前的解压情况。(pyintaller
打包应用为一个单独的exe后,再点击生成的exe时,会先解压相应的资源,然后解压完成后再运行)本文下面介绍怎么使用pyintaller
的闪屏。
使用方法
下图就是打开应用后弹出的一个闪屏,这个闪屏会在点击exe后立即弹出,然后在下面显示当前正在解压的文件。
在打包之前需要在要打包的main.py
文件中添加一些代码,添加后的代码如下:
if __name__ == '__main__':
##
try:
import pyi_splash
pyi_splash.update_text('UI Loaded ...')
pyi_splash.close()
except:
pass
##
# 上面两个##之间的代码是要添加的
app = QApplication(sys.argv)
myshow = RawSigProcess()
myshow.show()
sys.exit(app.exec())
添加上面的代码后,使用下面的打包命令:
打包命令:pyinstaller -F -w -i main.ico main.py --splash splash.png
使用上面的命令后,会将main.py
打包成一个图标名为main.ico
,闪屏图片为splash.png
的单独exe应用,该应用在运行时不会弹出cmd窗口。其中main.ico
splash.png
需要自己提供,并放在和main.py
同级的目录下。
运行上面的命令后,打开生成的main.exe
,这时候也会弹出闪屏,但是闪屏中不会显示当前解压的文件,如果需要显示当前解压的文件,需要修改pyinstaller
打包生成的.spec
文件。
在使用上面的打包命令后,会在main.py
同级的目录下生成文件main.spec
,为了显示当前的解压文件,需要将跟添加闪屏(splash)有关的部分进行修改,具体可以参考pyinstaller官方文档。
splash = Splash(
'splash2.png',
binaries=a.binaries,
datas=a.datas,
text_pos=(75,295),
text_size=-15,
test_color='black',
minify_script=True,
always_on_top=True,
)
其中text_pos
为要显示的解压文件的文字位置,文字的原点为左下角,闪屏的原点为图片的左上角。text_size
为文字的大小,如果为正则表示字体大小单位为磅,为负时,表示单位为像素。test_color
为字体颜色,但是我不知道为什么不起作用。
修改完main.spec
文件中,需要再进行打包,但是此时要根据spec
文件打包。命令为:
pyinstaller main.spec
运行上面的命令之后,就会生成带闪屏且有解压提示的exe。
核心步骤
- 使用命令
pyinstaller -F -w -i main.ico main.py --splash splash.png
打包- 修改
main.spec
文件- 使用命令
pyinstaller main.spec