如何在 OSX 上通过 Python Tkinter 安装和使用 TkDnD?

Posted

技术标签:

【中文标题】如何在 OSX 上通过 Python Tkinter 安装和使用 TkDnD?【英文标题】:How to Install and Use TkDnD with Python Tkinter on OSX? 【发布时间】:2014-10-15 03:31:18 【问题描述】:

我花了一些时间寻找可行的解决方案,在 OSX 平台上使用 Python Tkinter 进行拖放行为,找到的最可能的解决方案是 TkDnD 库。 http://sourceforge.net/projects/tkdnd/files/

但是,我找不到任何有关安装的手册或指南,而且在 OSX 上基本上没有示例。谁能和我分享他们的经验?

此外,使用 Tkinter 作为 GUI 解决方案不是一个好的选择吗?我的用户都是 OSX 平台,所有这些机器上都预装了 Python。有什么好的建议可以在不额外安装的情况下找到原生 GUI 支持? PyQT 似乎是另一种选择,但不确定它是否需要在客户端机器上进行额外安装。

【问题讨论】:

tkinter 对于某些类型的 GUI 来说很好,但对其他类型的 GUI 则不太好。你的 GUI 会做什么? 你看过这个答案吗? ***.com/a/14283431/7432 布莱恩,感谢您的评论。是的,我确实阅读了有关 Python 包装器的链接。但它没有任何关于如何正确安装 TkDnD 的信息。我想一旦我成功安装它,我就可以将它与那个 Wrapper 一起使用。 GUI 用于视频上传客户端软件。它具有显示视频文件信息、当前进度状态的能力,并且需要同时支持多个文件。 通过为 os.environ['TKDND_LIBRARY'] 设置路径和更新 dylib 位置解决了问题。谢谢。 【参考方案1】:

2021 年更新

这已经够烦我了,所以在作者did not responded之后我已经forked the repo and builtwheel 获取最新编译版本(2.9.2)并上传到pypi

您现在只需执行pip install tkinterdnd2,它应该可以工作。

导入是tkinterdnd2 而不是Tkinterdnd2。见demos

【讨论】:

太棒了!对我来说效果很好,感谢您让 Mac 用户轻松 10 倍!【参考方案2】:

这是 2020 年面向 MacOS Catalina 用户的更新。

首先,tkdnd 库项目已移至github。最新版本是 2.9.3,如果您不想自己编译库,最新版本是 2.9.2。

其次,将 tkdnd 库放在 /Library/Tcl 上不再起作用(您将收到“错误:未找到 tkdnd 库”)。使用 Catalina,python 在其自己的文件夹中查找 tkdnd 库,即 /Library/Frameworks/Python.framework/Versions/.../lib。将 tkdnd2.9.3 文件夹放在此路径中就可以了。

顺便说一句,仍然将 TkinterDnD2 Python 包装器放在 /Library/Frameworks/Python.framework/Versions/.../lib/python/site-packages 中在 Catalina 上工作。

澄清一下,我只测试了 Python 3 (3.8.5),我不知道 Python 2 的解决方案是否相同,但我想是的。

【讨论】:

【参考方案3】:

我通过下载在 Windows (10) 和 OSX (10.11) 上都可以使用: A) Tk 扩展 tkdnd2.8 来自https://sourceforge.net/projects/tkdnd/ B) Python 包装器 TkinterDnD2 来自https://sourceforge.net/projects/tkinterdnd/ 在 OSX 上: 1)将tkdnd2.8目录复制到/Library/Tcl 2)将TkinterDnD2目录复制到/Library/Frameworks/Python.framework/Versions/.../lib/python/site-packages (由于权限,使用 sudo 命令在 OSX 上复制文件。) 在 Windows 上: 1)将tkdnd2.8目录复制到...\Python\tcl 2)将TkinterDnD2目录复制到...\Python\Lib\site-packages

这是一个基于python drag and drop explorer files to tkinter entry widget 的简单测试用例。 TkinterDnD2 下载附带了更强大的示例。

    import sys
    if sys.version_info[0] == 2:
        from Tkinter import *
    else:
        from tkinter import *
    from TkinterDnD2 import *

    def drop(event):
        entry_sv.set(event.data)

    root = TkinterDnD.Tk()
    entry_sv = StringVar()
    entry_sv.set('Drop Here...')
    entry = Entry(root, textvar=entry_sv, width=80)
    entry.pack(fill=X, padx=10, pady=10)
    entry.drop_target_register(DND_FILES)
    entry.dnd_bind('<<Drop>>', drop)
    root.mainloop()

更新:上述过程适用于 Python 2 或 3。

【讨论】:

哇,该方法在 Windows 7 上与 Python 3.6.4 完美配合。几乎好得令人难以置信。非常感谢! 这确实有效!实际上,我只需要 2 步(python 3.9 win10/64bit)【参考方案4】:

这是 2017 年的更新,包含更多细节,因为 Mac 决定无法将文件写入 /System/Library。以下解决方案也是跨平台的,因为我目前正在为使用 TkDnD 的 Windows/Mac 编写一个应用程序。

以下解决方案适用于 pyInstaller,也适用于 Mac OS 10.12 和 Windows 7。

首先,我们需要获取到 tkDnD 所在位置的路径。默认情况下,我将 tkdnd2.8 文件夹放在 main.py 旁边。

import sys, os
if getattr(sys, 'frozen', False):
    # If the application is run as a bundle, the pyInstaller bootloader
    # extends the sys module by a flag frozen=True and sets the app 
    # path into variable _MEIPASS'.
    application_path = sys._MEIPASS
else:
    application_path = os.path.dirname(os.path.abspath(__file__))

TK_DND_PATH = os.path.join(application_path,'tkdnd2.8')

请注意,Ellis 的解决方案直接使用 Tcl,修改路径。确保在某个地方,你有这个要点:

import tkinter as tk
root = tk.Tk()
root.eval('lappend auto_path ' + TK_DND_PATH + '')

在此之后,每当您碰巧实际导入 tkDnD 时,它都会找到它。我使用了 DnD.py。如果没有 'lappend auto_path' 命令,我的程序永远找不到 tkDnD。

https://mail.python.org/pipermail/tkinter-discuss/2005-July/000476.html

【讨论】:

我在 OSX 10.11 上。虽然我无法写入 /System/Library,但我可以写入 /Library。将 tkdnd2.8 目录放在那里是可行的,不需要路径或其他 Python 重新配置即可找到 tkdnd 文件。【参考方案5】:

我花了几天时间弄清楚如何安装 TkDnD lib,虽然这听起来是一个简单的问题,但确实让我有些困惑。

在 OSX 上安装 TkDnD 的两种方法: A.复制到/System/Library/Tcl/8.x: OSX 已经预装了 Python,这是安装 Tcl 库的路径。使用 Tk/Tcl lib 时会自动加载 TkDnd lib。

B.将os.environ['TKDND_LIBRARY'] 设置为 TkDnd2.x.dylib 的位置: 示例代码:

if sys.platform == 'win32':
   if getattr(sys, 'frozen', False):
      os.environ['TKDND_LIBRARY'] = os.path.join(os.path.dirname(sys.executable), 'tkdnd2.7')

【讨论】:

以上是关于如何在 OSX 上通过 Python Tkinter 安装和使用 TkDnD?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OSX 上安装 python-gtk2、python-webkit 和 python-jswebkit

如何在 OSX 上正确安装 Python 以与 OpenCV 一起使用?

如何通过终端/CLI 在 Mac 机器上安装 OSX .provisionprofile?

如何检查安装在 osx 和 centos 上的所有 python 版本

如何在OSX系统上安装Opencv3和Python2.7

在 OSX Yosemite 上打包 Kivy Python 应用程序不起作用