python 3.5 上带有 tkinter 应用程序的 Pyinstaller 问题

Posted

技术标签:

【中文标题】python 3.5 上带有 tkinter 应用程序的 Pyinstaller 问题【英文标题】:Problems with Pyinstaller with tkinter app on python 3.5 【发布时间】:2017-11-15 15:43:19 【问题描述】:

刚刚开始使用 Pyinstaller(以及一些 Tk 窗口)并且无法让我的 tkinter Windows 应用程序(在 python 3.5 下)成功运行。我可能正在做一些愚蠢的事情,但我已经尝试了我所知道的一切,我真的需要让它运行,所以非常感谢任何帮助。请注意,我所有的代码在普通的 python 3.5.1 和 3.5.3 下都可以正常运行。安装了最新版本的 PyInstaller (3.2.1),它似乎运行正常。

我切换到以下简单的窗口式“Hello World!”应用程序看看我是否可以让它工作,

from tkinter import *
root = Tk()
root.title("Test Window")

#Setup window widgets and place on window
l1 = Label(root,text='Hello World!',font=("Verdana",18))
l2 = Label(root,text='Hello World!',font=("Times New Roman",9))
b1 = Button(root, text='Button 1', font=("Verdana",12), state=DISABLED)
b1.pack()
b1.place(x=220, y=180)

l1.pack()
l1.place(x=170, y=10)
l2.place(x=200, y=60)

root.mainloop()

但它似乎与我的原始应用程序存在相同的问题。

也许这只是因为我是 PyInstaller 的新手,但我发现文档并不容易从中找到具体答案。但再深入一点,我决定在命令行中添加 -d 选项以查看调试输出,因为它试图执行我的应用程序,所以我使用的完整命令行是:> pyinstaller -F - w -dc:\PythonApps\Hello.py 。这给了我很多以这条错误消息结尾的信息:

执行脚本 pyi_rth_tkinter 失败。

这与我在原始程序中看到的错误相同。我能够在我的系统上找到“pyi_rth_tkinter.py”(实际上是该文件的 2 个版本),但不确定为什么 PyInstaller 执行它时遇到问题。但是由于该文件会吐出有关 Tcl 和 Tk 数据目录路径问题的错误消息,因此猜测它无论如何都会失败,即使它找到并运行了该文件。

好的,在 PyInstaller 运行期间更仔细地查看输出,我发现有几行看起来可能会导致我的问题:

3541 INFO: Loading module hook 'hook-_tkinter.py'
ImportError: cannot import name 'Tcl'
3659 ERROR: Tcl/Tk improperly installed on this system.

我查看了“hook-_tkinter.py”挂钩文件(并通读了 PyInstaller 文档),但没有发现任何明显的问题。但我并不完全了解钩子文件的所有细节以及它们需要包含的确切内容(任何人都可以帮助解决这个问题吗???)。不完全确定问题是什么,但似乎 PyInstaller 在链接到 tkinter 时出现问题,这导致我的应用程序无法运行。有没有人使用 PyInstaller 3.2.1 来执行一个简单的 Python 3.5 WINDOWS 应用程序?如果是这样,请分享如何!我已经进行了大量的搜索和阅读,但还没有发现问题所在。如果有人有线索,请帮助。非常感谢任何指导!


一些附加信息。不知道为什么 PyInstaller 说 Tcl/Tk 没有正确安装。我刚刚安装了 Python 3.5.3 并自动安装了 tkinter。在外壳中执行 'tkinter._text()' ,它似乎工作正常。在正常使用 python 的情况下,我对 tkinter 的所有使用似乎在所有 3.5 版本下都可以正常工作。我遇到的唯一 tkinter 问题是 PyInstaller。验证了使用 'tkinter.Tcl().eval('info patchlevel')' 安装的 Tcl/Tk 的确切版本,它报告了 '8.6.4'。有谁知道 Tcl/Tk 的任何其他安装问题可能是个问题?我没有做任何特别的安装 tkinter,我只是在全新安装 'python 3.5.3' 后通过 'pip install pyinstaller' 正常安装了 pyinstaller .还有什么我应该做的吗?非常感谢任何帮助!!!

【问题讨论】:

【参考方案1】:

我在使用 tkinter 和 python 3.5 时遇到了类似的问题 看完https://pythonhosted.org/PyInstaller/hooks.html#understanding-pyinstaller-hooks

添加 --hidden-import tkinter 的选项

pyinstaller --onefile --hidden-import tkinter hello.py

【讨论】:

【参考方案2】:

我遇到了同样的问题,在寻找正确答案的过程中被困了 6 个小时。在我完成以下步骤后,它现在对我有用:

    卸载所有 Python 解释器。 下载 Python-2.7.16.amd64 版本(适用于 64 位操作系统)或 Python-2.7.16 版本(适用于 32 位操作系统)。 转到这台电脑 -> 高级系统设置 -> 环境变量 选择路径并单击编辑 添加以下路径: 一种。 C:\Python27\脚本\ 湾。 C:\Python27\ 打开cmd 键入“pip install pyinstaller”

    安装 pyinstaller 后,导航到程序所在的文件夹(即在 tkinter GUI 中)

    在 cmd 中输入:

    pyinstaller 程序.py

这将解决您的问题。

我找到的解决方案是卸载所有 Python 解释器并安装 2.7 版本。

附:新的***

【讨论】:

以上是关于python 3.5 上带有 tkinter 应用程序的 Pyinstaller 问题的主要内容,如果未能解决你的问题,请参考以下文章

让 tkinter 在带有 asdf 的 macos 上使用 python 3.x

展开 Tkinter 框架

结合 Tkinter 和 win32ui 使 Python 在退出时崩溃

带有tkinter输入框的动态变量

Python,Tkinter:如何在可滚动画布上获取坐标

带有无头 Chrome 的 Tkinter 在 Mac 上运行良好,但在 Ubuntu 服务器上运行不正常