Pyinstaller打包Tkinter创建的GUI 应用程序

        耗时一个月,用python写的利用穿越火线交易所刷CF点的代码已经完成了。考虑到使用方便和学习的态度,我用Tkinter将源码创建为UI界面,如图所示。本文主要介绍如何将Tkinter创建的GUI打包为exe可执行文件,使用的是Pyinstaller。Pyinstaller打包Tkinter创建的GUI 应用程序_第1张图片

1. pip来安装Pyinstaller模块。

 

2. 命令行输入:

pyinstaller -i 1.ico -F -w dealUI.py

 

-F生成一个文件,-w用于隐藏命令行。无法生成exe,提示'gbk' codec can't decode byte 0x80 in position 166: illegal multibyte sequence,原因是源码中有两行print输出,而我将默认带的stdout控制台去掉了(-w参数)。去掉这两行输出。

然后可以生成dealUI.exe,但是无法打开,提示failed to execute script dealUI。

 

3. 鉴于此错误,我需要增加-d参数(产生debug版本的可执行文件),并去除-w,生成exe之后,在命令行运行(cd到对应目录,输入.\dealUI),可查看调试信息,发现错误:

Traceback (most recent call last):
  File "dealUI.py", line 238, in 
  File "dealUI.py", line 233, in main
  File "tkinter\__init__.py", line 1865, in wm_iconbitmap
_tkinter.TclError: bitmap "1.ico" not defined
 

 

将源码中

root.iconbitmap(rb'1.ico')

改为注释,再次生成exe,可以正常打开,但界面图标仍为默认图标。

 

Pyinstaller打包Tkinter创建的GUI 应用程序_第2张图片

 

4. 最后探索如何给GUI界面上添加图标。参考(https://blog.csdn.net/lion_cui/article/details/51329497),原链接方法有很大问题,我做了改动

新建ico.py:

# 这段程序可将图标1.ico转换成icon.py文件里的base64数据
import base64
open_icon = open("1.ico","rb")
b64str = base64.b64encode(open_icon.read())
open_icon.close()
write_data = "img = '%s'" % b64str
f = open("icon.py","w+")
f.write(write_data)
f.close()

执行,生成的icon.py即是1.ico的base64编码:

img = 'b'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs/Ov/7P7s/+z87P/s/uz/6/vr/+f36f/e6t7/0NbK/+z66f/n3LH/6dCW/+jt0P/s/+z/7P/s/+z/7P/s/+z/6/7s/+v67P/q+ev/6/rq/+n56v/r+uv/4/Dk/93k2f/r9On/6ubI/+XCi//o9eH/7P/s/+z/7P/s/+z/7P/s/+v57P/p9+r/5/bp/+j46f/n9+n/6Pbo/+Py5v/d5tr/7vPp/+ffyv/TnHL/6PTj/+z/7P/s/+z/7P/s/+z/7P/t/O3/6/zs/+j26v/i8uX/3+zj/93r4f/X5d7/3+vh/+vt4v/l3tD/0Jp6/+397P/s/+z/7P/s/+z/7P/s/+z/7fvt/+v66//o9+r/5PPn/+j06f/l8ej/2eff/9Da1f/m4dH/372i/9Oae//n8eD/7P/s/+z/7P/s/+z/7P/s/+v77f/t/Oz/7Pzs/+n36f/l8uj/2ufe/9De2f/M0sv/3Me4/9uqj//RjnH/6fTl/+z+7P/s/+z/7P/s/+z/7P/r/ez/7Pvt/+v66//r/Ov/6vrs/+r46v/a49//ytDM/8++uf/ZoZv/uVVO/55IQP/Z18r/7P7s/+z/7P/s/+z/7P/s/+z/7P/s/uz/7P3r/+z/7P/p9+r/sLm6/7i6u//Pwsb/zZij/7FEXf+rK07/sWR9/+z97f/s/+z/7P/s/+z/7P/s/+z/7P7s/+z+7P/s/uz/7P3r/9Te1//Iycj/07zH/8KCn/+xO2//oiRV/5JEYP/t/e3/7P/s/+z/7P/s/+z/7P7s/+z97P/s/uz/6/zs/+v+6//r/uz/5/Pn/9/T1v+6eJz/iSRW/20YRf+oi5f/7P7s/+z/7P/s/+z/7P/s/+v+6//r/uz/7P7s/+v+7P/s/uz/7P3s/+757f/s7ez/1rzO/7WPpv/EuL3/7P3s/+z/7P/s/+z/7P/s/+z/7P/s/+z/6/3r/+z97P/s/+z/6/7r/+v/6//s/ez/6/vs/+v46//s+Oz/7P7s/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z+7P/s/+z/7P/s/+z/7P/s/uz/7P/s/+z+7P/r/ez/7fzs/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+v86//s/uz/7P/s/+z/7P/s/+z/7P7s/+v+6//s/uz/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/r/uz/7P7s/+z+7P/s/+z/7P7s/+z/7P/r/ez/6/vr/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+v96//q++z/7P/s/+z+7P/s/+z/6/7r/+z77P/s/uz/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==''

直接使用该变量会出语法问题,改动如下

img = '''AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs/Ov/7P7s/+z87P/s/uz/6/vr/+f36f/e6t7/0NbK/+z66f/n3LH/6dCW/+jt0P/s/+z/7P/s/+z/7P/s/+z/6/7s/+v67P/q+ev/6/rq/+n56v/r+uv/4/Dk/93k2f/r9On/6ubI/+XCi//o9eH/7P/s/+z/7P/s/+z/7P/s/+v57P/p9+r/5/bp/+j46f/n9+n/6Pbo/+Py5v/d5tr/7vPp/+ffyv/TnHL/6PTj/+z/7P/s/+z/7P/s/+z/7P/t/O3/6/zs/+j26v/i8uX/3+zj/93r4f/X5d7/3+vh/+vt4v/l3tD/0Jp6/+397P/s/+z/7P/s/+z/7P/s/+z/7fvt/+v66//o9+r/5PPn/+j06f/l8ej/2eff/9Da1f/m4dH/372i/9Oae//n8eD/7P/s/+z/7P/s/+z/7P/s/+v77f/t/Oz/7Pzs/+n36f/l8uj/2ufe/9De2f/M0sv/3Me4/9uqj//RjnH/6fTl/+z+7P/s/+z/7P/s/+z/7P/r/ez/7Pvt/+v66//r/Ov/6vrs/+r46v/a49//ytDM/8++uf/ZoZv/uVVO/55IQP/Z18r/7P7s/+z/7P/s/+z/7P/s/+z/7P/s/uz/7P3r/+z/7P/p9+r/sLm6/7i6u//Pwsb/zZij/7FEXf+rK07/sWR9/+z97f/s/+z/7P/s/+z/7P/s/+z/7P7s/+z+7P/s/uz/7P3r/9Te1//Iycj/07zH/8KCn/+xO2//oiRV/5JEYP/t/e3/7P/s/+z/7P/s/+z/7P7s/+z97P/s/uz/6/zs/+v+6//r/uz/5/Pn/9/T1v+6eJz/iSRW/20YRf+oi5f/7P7s/+z/7P/s/+z/7P/s/+v+6//r/uz/7P7s/+v+7P/s/uz/7P3s/+757f/s7ez/1rzO/7WPpv/EuL3/7P3s/+z/7P/s/+z/7P/s/+z/7P/s/+z/6/3r/+z97P/s/+z/6/7r/+v/6//s/ez/6/vs/+v46//s+Oz/7P7s/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z+7P/s/+z/7P/s/+z/7P/s/uz/7P/s/+z+7P/r/ez/7fzs/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+v86//s/uz/7P/s/+z/7P/s/+z/7P7s/+v+6//s/uz/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/r/uz/7P7s/+z+7P/s/+z/7P7s/+z/7P/r/ez/6/vr/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+v96//q++z/7P/s/+z+7P/s/+z/6/7r/+z77P/s/uz/7P/s/+z/7P/s/+z/7P/s/+z/7P/s/+z/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='''''

dealUI.py添加代码。

from icon import img
import os

tmp = open("tmp.ico", "wb+")
tmp.write(base64.b64decode(img))
tmp.close()
root.iconbitmap('tmp.ico')  # 加图标
os.remove("tmp.ico")  # 删掉临时文件

再次pyinstaller命令:

pyinstaller -i 1.ico -F -w --upx C:\Users\Ysx\Desktop\upx394w dealUI.py

 

这里的--upx参数对应用加壳,可以压缩源程序的大小。使用之后还出现了一个错误,提示VCRUNTIME140.dll没有被指定在 Windows 上运行,这是因为打包使用的VCRUNTIME140.dll有问题,重新将自己电脑上system32里头的VCRUNTIME140.dll替换即可,替换的位置查看pyinstaller过程中打包对应dll时的报错。

 

替换生成exe即可。

此外,打包时加入的ico图标,建议生成16、32、64、128及256多种大小的png图片,然后使用png2ico转换为1个ico图标文件,这样能够满足应用程序在文件夹、桌面等位置时,自适应调节图标大小。(下载地址:http://www.winterdrache.de/freeware/png2ico/)

最终命令:

pyinstaller -i z.ico -F -w --upx upx394w dealUI.py

 

 

 

 

你可能感兴趣的:(python)