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

Ell*_*hen 2 python macos tkinter python-2.7 python-3.x

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

但是我找不到任何关于安装的手册或指南,基本上没有OSX上的样品......任何人都可以与我分享他们的经验吗?

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

谢谢.埃利斯

Gar*_*127 8

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











这是一个基于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()
Run Code Online (Sandbox Code Playgroud)

更新:上述过程适用于Windows上的Python 3.6.3,因此我更新了示例代码以在Py3上运行.


aon*_*152 5

这是 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')
Run Code Online (Sandbox Code Playgroud)

请注意,Ellis 的解决方案直接适用于 Tcl,修改路径。确保在某个地方,你有一些符合这个要点的东西:

import tkinter as tk
root = tk.Tk()
root.eval('lappend auto_path {' + TK_DND_PATH + '}')
Run Code Online (Sandbox Code Playgroud)

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

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


Ell*_*hen 3

我花了几天时间才弄清楚如何安装 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')
Run Code Online (Sandbox Code Playgroud)