*.py 脚本与 tkinterdnd2 模块不编译为可执行文件

*.py script with tkinterdnd2 module doesn`t compile to an executable file

我制作了一个使用 tkinter 和 tkinterdnd 模块的应用程序。当我将它作为脚本启动时它工作得很好,但是当我尝试从它制作可执行文件并启动它时,出现以下错误:

Traceback (most recent call last):
  File "TkinterDnD2\TkinterDnD.py", line 53, in _require
_tkinter.TclError: can't find package tkdnd

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "IxcomGUI.py", line 128, in <module>
  File "IxcomGUI.py", line 11, in __init__
  File "TkinterDnD2\TkinterDnD.py", line 285, in __init__
  File "TkinterDnD2\TkinterDnD.py", line 55, in _require
RuntimeError: Unable to load tkdnd library.
[14512] Failed to execute script 'IxcomGUI' due to unhandled exception!

我试过以下方法:

  1. 使用 pip install 安装 tkinterdnd2 并使用 pyinstaller myscript.py 构建。
  2. 如视频中所示手动安装 tkinterdnd2 模块 https://www.youtube.com/watch?v=JIy0QjwQBl0&t=605s&ab_channel=RamonWilliams 并使用 pyinstaller myscript.py
  3. 构建
  4. 重复上一步,但添加了这个东西https://github.com/pmgagne/tkinterdnd2/blob/master/hook-tkinterdnd2.py
  5. 试图隐式告诉 pyinstaller 到 tkdnd 模块的路径,并使用 --paths 标志指定到模块的路径。

所有这些尝试都导致了以下错误。有人知道某种解决方案吗?

显然,解决这个问题出乎意料的容易。您只需要进入<YourPath>\Python39\tcl 目录并找到tkdnd2.8 目录,并将其移动到tcl8.6 目录即可。我也把它重命名为tkdnd,但是我不知道是否有必要。

这是拯救我一天的原 link:http://pyinstaller.47505.x6.nabble.com/tkinter-TclError-can-t-find-package-tkdnd-td2330.html

这里的问题是拖放需要两个组件:TCL 库和它们的 Tkinter 接口。我手动安装两者以配置我的环境。 (请参阅我对 How to Install and Use TkDnD with Python Tkinter on OSX? 的回答)。我知道有人在 PyPI 上为 TkinterDnD2 打包了一些东西,但我没有研究过。

我有一个使用 TkinterDnD2 的项目。我使用 PyInstaller 构建它并看到与您看到的相同的错误(或多或少)。 运行 使用 --onedir 选项(而不是 --onefile 选项)的 PyInstaller,我发现 tkdnd2.8 从我的 dist 目录中丢失。

为了纠正这个问题,我在 Windows 添加了

--add-binary "C:/Python/Python38-32/tcl/tkdnd2.8;tkdnd2.8"

到 PyInstaller 命令行,这就成功了。我现在可以构建一个 --onefile 可执行文件,它运行时没有错误。