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

5 投票
5 回答
18235 浏览
提问于 2025-04-18 18:03

我花了一些时间在网上寻找在OSX平台上用Python Tkinter实现拖放功能的可行方案,发现最有可能的解决办法是使用TkDnD库。http://sourceforge.net/projects/tkdnd/files/

不过,我找不到任何关于安装的手册或指南,基本上在OSX上也没有示例。有没有人能分享一下他们的经验?

另外,使用Tkinter作为图形界面解决方案是不是一个好选择?我的用户都是使用OSX平台的,而Python在这些机器上都是预装的。有没有好的建议可以找到本地的图形界面支持,而不需要额外安装?PyQT似乎是另一个选择,但我不确定它是否需要在客户端机器上额外安装。

5 个回答

1

这是一个关于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的解决方案是否一样,但我猜应该是相似的。

4

2021年更新

这件事让我很烦,所以在作者没有回应之后,我复制了这个项目并构建了最新版本(2.9.2)的安装包,并把它上传到pypi上。

现在你只需要运行 pip install tkinterdnd2,就可以正常使用了。

导入时要用 tkinterdnd2,而不是 Tkinterdnd2。可以查看示例

5

这是2017年的一个更新,内容更详细,因为苹果公司决定让我们无法在/System/Library目录下写文件。下面的解决方案是跨平台的,因为我现在正在为Windows和Mac编写一个使用TkDnD的应用程序。

这个解决方案适用于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

17

我在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
(在OSX上复制文件时需要用sudo命令,因为权限问题。)

在Windows上:
1) 把tkdnd2.8文件夹复制到...\Python\tcl
2) 把TkinterDnD2文件夹复制到...\Python\Lib\site-packages

这里有一个简单的测试案例,基于这个链接的内容:python拖放文件到tkinter输入框。下载的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。

3

我花了几天时间才搞明白怎么安装TkDnD库,虽然听起来是个简单的问题,但让我有点困惑。

在OSX上安装TkDnD有两种方法:

A. 复制到 /System/Library/Tcl/8.x

OSX自带了Python,而这个路径就是Tcl库安装的地方。使用Tk/Tcl库时,TkDnd库会自动加载。

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')

撰写回答