Pyinstaller tkinter打包问题

it2025-01-16  5

与类似工具相比,PyInstaller的主要优势在于PyInstaller可与Python 3.5-3.7一起使用;由于透明压缩,它可以构建较小的可执行文件;它是完全多平台的;并使用OS支持来加载动态库,从而确保完全兼容。—官网 其他的打包工具支持python的版本不同,详细看官网 官方文档:地址 安装开发版(最新) pip install https://github.com/pyinstaller/pyinstaller/tarball/develop

问题

很多时候是因为第三方库的版本太高了 pyinstalelr打包遇到过的问题:

第一次距离现在1年多了,细节不是很清楚,那次问题涉及的库比较少, imageio应该是这个,功能简单。当时python版本3.6.3,一直打包失败。按照报错信息,把要安装的都装了,还是一直失败。最后再某个网站上看到说是把 numpy的版本降级,然后就打包好了。原因不明,项目中没有用到numpy,猜测有可能是imageio可能用到了。当时没有细究。第二次python:3.6.3,具体忘了。少了个dll文件,在电脑中找到,放进去好了。第三次(本次):python:3.7.9, pyinstaller: 4.0, tkinter 中途换过pyinstaller的版本,,3.2.1, 4.1(测试版本,github上下载) 在没有使用matplotlib之前,用所有版本打包不成功,测试版本成功。 使用了matplotlib之后,一直不成功。 报错信息(忘了保存):The MATPLOTLIBDATA environment variable was deprecated in Matplotlib 3.1 and will be removed in 3.3. ............ .......... matplotlib.__init__................. NameError: 'defaultPara' is not defined 大致意思,就是可能用了那个模块,然后版本过高的问题,于是卸载改版本,降级,pip install matplotlin==3.2,成功,import warnings warnings.simplefilter("error") # 这句好像有没有都一样,,降级以后尝试的。未降级前未尝试

细节

关于路径的问题: 项目中使用的logo.ico, 文件。不要使用

import sys from pathlib import Path #self.root.iconbitmap('logo.ico') 不要使用这种 self.root.iconbitmap(Path(sys.argv[0]).parent.joinpath('logo.ico'))

关于数据库配置等信息: 如果创建 db.py, 将信息记录在里面,打包的时候会打包成死数据,无法修改。所以创建 db.ini(.config等文件)。

[mysqlConfig] user=root password=123456 host=192.168.0.101 port=3306 database=mingyang charset=utf8 [redisConfig] host=127.0.0.1 port=6379

然后使用configparser读取文件

import configparser import sys from pathlib import Path cf = configparser.ConfigParser() cf.read(Path(sys.argv[0]).parent.joinpath('software.ini')) cf.sections() my_user = cf.get('mysqlConfig', 'user') my_password = cf.get('mysqlConfig', 'password') my_host = cf.get('mysqlConfig', 'host') my_port = cf.get('mysqlConfig', 'port') my_database = cf.get('mysqlConfig', 'database') my_charset = cf.get('mysqlConfig', 'charset') redis_host = cf.get('redisConfig', 'host') redis_port = cf.get('redisConfig', 'port')

.spec文件

生成命令 建议先生成spec文件,在使用spec文件打包 pyinstaller options name.spec pyinstaller name.spec

# -*- mode: python3 ; coding: utf-8 -*- block_cipher = None a = Analysis(['mainPage.py', 'db.py', 'models.py', 'rili.py'], ;将相关的py文件都仍进来 pathex=['D:\\workspace\\****\\Transfromer'], binaries=[], datas=[('logo.ico', '.'), ('msyh.ttc', '.'), ('software.ini', '.')], ;静态文件,元组,(文件路径,放置路径) hiddenimports=[], ;添加不要装进去的模块,就是找不到的模块(没试过) hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, [], exclude_binaries=True, name='mainPage', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=False , icon='tubiao.ico') ; 不要黑框, 生成exe图标 coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='mainPage')

调试

打包成功后会出现两个文件夹(非 -F),build存放一些信息的,不用,打包好的放在dist中。 一般打包过程中的日志在这个文件里。可以从中找问题,,关于 missMoudle的,没用过,没找到。

关于提示successfully,文件打包好以后,不能运行,, 出现Failed to execute script xxxx,,解决方案

打包的时候不要使用 -w命令,然后生成exe,直接拖到cmd中运行,,会出现提示信息,,关于代码的。逐个解决就好。

错误

No module named 'wx' pip install -U wxPython python -m pip install pywin32

最新回复(0)