使用Pyinstaller给python工程打包&TclError: can’t find package Tix
最近项目上碰到给写的工具打包的问题,记录一下。
难点背景
1.使用pyinstaller打包多文件夹结构的py工程
2.项目上使用了tix库,但是导入丢失的问题
难点2的背景:
我在创建页面的时候,需要创建一个可勾选的树形图,tkinter库里面没有,所以我使用了tkinter.tix库,我以为初始化toplevel界面的时候类继承自tkinter库,但是在创建root页面的时候,发生如下情况导致我必须继承tix库。
self.cl = tix.CheckList(self.configure_dops_frame, browsecmd=self.selectItem)
self.configure_dops_frame is son of root
root=tk.Tk() is ×
root=tix.Tk() is √
项目结构
文件结构:
generate:工程文件夹
resource:资源文件夹
ecu.xml
insertnode.xml
use_method:功能函数调用文件夹
__init__.py
use_func.py
xml_analysis_set.py
use_window:界面调用参数文件夹
__init__.py
set_parameter.py
__init__.py
__init_window__.py
关于为什么会有这么多个__init__.py是由于python的多文件夹引用文件机制;
pyinstaller安装与配置
使用pip install pyinstaller 或者是pycharm的添加库安装都可以,这个查教程就行不细说
注意自己使用的python编译器,后文需要使用
pyinstaller使用
进入项目所在的路径下的终端
我的是c:xxxx\xxxx\xxxx\generate文件夹
步骤:
1.在此路径终端下输入: pyi-makespec __init_window__.py
2.进入生成的__init_window__.spec
文件格式如下:
同generate文件夹下py文件可以不用写绝对路径,其他的都需要写绝对路径;datas里面以()一组的格式写了需要引用的xml类型文件存在的文件夹。
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['__init_window__.py',
'__init__.py',
'C:xxxx\\xxxx\\xxxx\\generate\\use_method\\__init__.py',
'C:xxxx\\xxxx\\xxxx\\generate\\use_method\\use_func.py',
'C:xxxx\\xxxx\\xxxx\\generate\\use_method\\xml_analysis_set.py',
'C:xxxx\\xxxx\\xxxx\\generate\\use_window\\__init__.py',
'C:xxxx\\xxxx\\xxxx\\generate\\use_window\\set_parameter.py'],
pathex=['c:xxxx\\xxxx\\xxxx\\generate'],
binaries=[],
datas=[('c:xxxx\\xxxx\\xxxx\\generate\\resource', 'resource')],
hiddenimports=['tix'], ***这里应该是没生效的,可以删除***
hookspath=[],
hooksconfig={},
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='__init_window__',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='__init_window__',
)
3.在终端使用pyinstaller __init_window__.spec命令进行打包,看见successful就成功,但是打包完了不一定能用
打包后可能遇见的问题
我遇见的问题是:点击exe会弹出errot报错
File "tkinter\tix.py", line 214, in __init__ _tkinter.TclError: can't find package Tix
前面我使用的编译器路径是:
C:\Program Files\Python38
找到底下的tcl文件夹,打开找到tcl8.6、tix8.4.3
将tix8.4.3拖进tcl8.6,重新打包即可避免找不到包的报错
类似的还有can't find package Tix
都可以使用这种文件拖拽的方法