首页 > 解决方案 > PyInstaller + tkdnd/tkinterdnd2 启动冻结的 exe 时“无法加载 tkdnd 库”。从脚本启动时工作

问题描述

在我的脚本中,我使用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()

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

但是,当我使用 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 解释器中。

标签: pythontkinterpyinstaller

解决方案


--collect-all TkinterDnD2与大写一起使用。


推荐阅读