PyInstaller + tkdnd/tkinterdnd2 启动冻结的 exe 时“无法加载 tkdnd 库”。从脚本启动时有效

des*_*shu 5 python tkinter pyinstaller

在我的脚本中,我使用tkinterdnd2库来实现从 Windows 资源管理器到我的 tkinter UI 的拖放功能。

from tkinterdnd2 import TkinterDnD, DND_FILES
import tkinter as tk

class TkWindow:
    def __init__(self):
        self.window = TkinterDnD.Tk()
        self.tbox = tk.Listbox(self.window)
        self.tbox.pack(fill=tk.BOTH)
        self.tbox.drop_target_register(DND_FILES)
        self.tbox.dnd_bind('<<Drop>>', self.tk_files_dropped)
        self.window.mainloop()

    def tk_files_dropped(self, event):
        messagebox.showinfo("x", event.data)

TkWindow()
Run Code Online (Sandbox Code Playgroud)

当我启动脚本时 - 一切正常。

但是当我使用 PyInstaller 将项目冻结为单个 EXE 并运行它时,出现以下错误:

无法加载 tkdnd 库。

我已经尝试过这个解决方案:

  1. 我按照存储库中的说明添加了 pyinstaller-hook tkinterdnd2

    from PyInstaller.utils.hooks import collect_data_files, eval_statement
    datas = collect_data_files('tkinterdnd2')

  2. --collect-all tkinterdnd2在执行构建命令时添加。

  3. 我尝试复制tkdnd2.8这个答案tcl8.6中提到的

  4. 我尝试摆脱 venv 并将所有包直接安装到基本 python 解释器中。

小智 3

我用的--collect-all TkinterDnD2是大写字母。