如何在OSX上使用Python Tkinter安装和使用TkDnD?
我花了一些时间在网上寻找在OSX平台上用Python Tkinter实现拖放功能的可行方案,发现最有可能的解决办法是使用TkDnD库。http://sourceforge.net/projects/tkdnd/files/
不过,我找不到任何关于安装的手册或指南,基本上在OSX上也没有示例。有没有人能分享一下他们的经验?
另外,使用Tkinter作为图形界面解决方案是不是一个好选择?我的用户都是使用OSX平台的,而Python在这些机器上都是预装的。有没有好的建议可以找到本地的图形界面支持,而不需要额外安装?PyQT似乎是另一个选择,但我不确定它是否需要在客户端机器上额外安装。
5 个回答
这是一个关于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的解决方案是否一样,但我猜应该是相似的。
2021年更新
这件事让我很烦,所以在作者没有回应之后,我复制了这个项目并构建了最新版本(2.9.2)的安装包,并把它上传到pypi上。
现在你只需要运行 pip install tkinterdnd2
,就可以正常使用了。
导入时要用 tkinterdnd2
,而不是 Tkinterdnd2
。可以查看示例。
这是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
我在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。
我花了几天时间才搞明白怎么安装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')