PyInstaller打包含ttkwidgets的Python脚本成exe后模块缺失报错
打包含ttkwidgets的Python脚本为exe时提示找不到模块
问题详情
- 脚本依赖
ttkwidgets.autocomplete.AutocompleteEntry,代码如下:
import tkinter as tk import work_logger_database from ttkwidgets.autocomplete import AutocompleteEntry root = tk.Tk() root.geometry('600x300') items = work_logger_database.show_all() stored_projects_list = list(set([items[i][2] for i in range(len(items))])) project_entry = AutocompleteEntry(root, completevalues=stored_projects_list) project_entry.grid(column=0, row=1, sticky='W') root.mainloop()
- 打包成exe后运行报错:
Failed to execute script due to unhandled exception: No module named ttkwidgets - 打包过程中收到警告:
WARNING: Several hooks defined for module 'numpy'. Please take care they do not conflict. - 已尝试的打包命令:
pyinstaller work_logger.py --onefile -w --hidden-import=ttkwidgets --hidden-import=ttkwidgets.autocompletepyinstaller work_logger.py --onefile -w --hidden-import=ttkwidgets
解决方案
方法1:用--collect-all强制收集完整模块
--hidden-import有时无法打包ttkwidgets的全部依赖文件,改用--collect-all参数可以强制收集该模块的所有文件:
pyinstaller work_logger.py --onefile -w --collect-all ttkwidgets
方法2:手动添加hook文件(方法1无效时尝试)
- 找到ttkwidgets的安装路径(比如虚拟环境下的
Lib\site-packages\ttkwidgets) - 创建
hook-ttkwidgets.py文件,内容如下:
from PyInstaller.utils.hooks import collect_all datas, binaries, hiddenimports = collect_all('ttkwidgets')
- 打包时指定hook文件所在目录:
pyinstaller work_logger.py --onefile -w --additional-hooks-dir=./hooks
(把hook文件放在当前目录的hooks文件夹下,或者替换成实际路径)
关于numpy的警告
该警告与ttkwidgets模块缺失问题无关,是numpy存在多个hook定义导致的。一般不影响exe运行,若介意可尝试更新PyInstaller到最新版本,或检查numpy版本兼容性。
内容的提问来源于stack exchange,提问作者Hjalti Geir Ágústsson
相关产品推荐
相关产品推荐

