【问题标题】:PyInstaller: "No module named Tkinter"PyInstaller:“没有名为 Tkinter 的模块”
【发布时间】:2023-12-30 04:29:01
【问题描述】:

我已经构建了一个使用 Tkinter 的 Python (2.7) 应用程序,并且正在尝试使用 Pyinstaller (3.2) 构建一个 Windows7 .exe。该应用程序在 Windows 中的工作原理是我以 python myapp.py 运行它,但一旦编译成可分发的 pyinstaller,我会收到以下错误消息:

ImportError: No module named Tkinter

为了确定,myapp.py 的顶部包含:

from copy import deepcopy
import cPickle as pickle
import Tkinter as tk
from PIL import ImageTk

查看分发目录,我看到了 tk85.dll、tcl85.dll 和两个相关的目录,tcl/ 和 tk/

我发现了许多对辅助 Tkinter 依赖项的引用,例如导入 Tkinter itslef 的 matplotlib,但我没有找到像这样的直接依赖项的任何细节。

任何想法如何让这个工作?

【问题讨论】:

  • 我将 Python 脚本转换为 exe,但发现 PyInstaller 会产生问题。尝试使用 Cx_Freeze 来代替。它是无忧无虑的,就像一个魅力。
  • 不知道那个。我会试一试,一旦我这样做了报告。
  • 我尝试了 cx_Freeze,离我更近了。我不得不加入一些排除项以避免某些包错误。但是,现在我遇到了字体问题。我正在使用的其中一个包也使用 Pillow 和一些 PIL 字体。我已经找到了为包存储字体的位置,但无法完全设置好以了解它们的存在。我将它们直接复制到 build/exe 目录,但没有运气。我还看到了 cx_Freeze 文档中关于包含数据文件的部分,但我不确定如何使其工作。

标签: python-2.7 tkinter pyinstaller


【解决方案1】:

检查https://github.com/pyinstaller/pyinstaller/issues/1584。 PIL 挂钩存在问题,它不包括 tkinter 模块。

一种解决方案是通过从排除导入中删除 modname_tkinter 来修改位于 YourPythonFolder\Lib\site-packages\PyInstaller\hooks 中的挂钩文件 hook-PIL.py。

或者只是更改代码中导入语句的顺序。做:

from PIL import ImageTk
import Tkinter as tk

【讨论】:

  • 不错的解决方案。请注意,使用from Tkinter import * 无法更改导入顺序,但可以按照上述方法轻松解决。
【解决方案2】:

您是否检查过:https://github.com/pyinstaller/pyinstaller/issues/1877(或其他问题)? https://github.com/pyinstaller/pyinstaller/wiki/If-Things-Go-Wrong

引自 issue 1877 “看起来 hook-_tkinter.py 无法处理自定义编译的 Tk。” 可能的解决方法:“谢谢,使用 yum 安装 tkinter、tix、tcl-devel 和 tk-devel 后,现在可以正常工作了。”

否则,Py2exe 也是创建 .exe 文件的一个选项,我已经在 tkinter 上多次使用它,没有任何问题。

【讨论】:

  • 我没见过。我没有使用自定义构建,但我会尝试安装其他软件包。我会试一试并在这里报告
  • 不幸的是,我发现我已经安装了所有这些软件包。
  • 我也尝试了 py2exe,发现我必须添加一些 DLL 排除项(numpy-atlas.dll 和 MSVCP90.dll)。编译后,它会失败并显示许多日志条目“ImportError:numpy.core.multiarray failed to import”我已经搜索了解决方案,但没有找到解决方案。
【解决方案3】:

我对此问题进行了扩展。在 hiddenimports 列表中包含 Tkinter 使我能够显示绘图,但我无法保存它们。通过将 FileDialog、tkFileDialog 和 tkMessageBox 添加到我的规范文件中的隐藏导入中解决了这个问题。即 hiddenimports=['FileDialog', 'Tkinter', 'tkFileDialog', 'tkMessageBox', ]

安格斯

【讨论】: