TkinterDnD2 is a python wrapper for George Petasis'' tkDnD Tk extension version 2
Project description
TkinterDnD2
Eliav2/tkinterdnd2 is a fork of the (unmaintained) pmgagne/tkinterdnd2 which is a python wrapper for tkdnd .
This repo was originally forked and edited for the purpose of publishing to pypi so one could simply install this package with pip install tkinterdnd2.
This repository is being maintained to ensure availability of tkinterdnd2 into the future, providing Tkinter native drag and drop support for windows, unix and Mac OSX.
What is TkDnD
tkDnD2 is a tcl/Tk extension adding native drag and drop support.
This repository contains the compiled binaries from https://github.com/petasis/tkdnd/releases/tag/tkdnd-release-test-v2.9.5 and my own compiled binaries for full Tcl 9 support: https://github.com/Squiblydoo/tkdnd.
Install
python -m pip install tkinterdnd2
Usage
import tkinter as tk
from tkinterdnd2 import DND_FILES, TkinterDnD
root = TkinterDnD.Tk() # notice - use this instead of tk.Tk()
lb = tk.Listbox(root)
lb.insert(1, "drag files to here")
def on_drop(event):
# event.data is a raw Tcl list string, not a Python list - see note below
for path in root.tk.splitlist(event.data):
lb.insert(tk.END, path)
# register the listbox as a drop target
lb.drop_target_register(DND_FILES)
lb.dnd_bind('<<Drop>>', on_drop)
lb.pack()
root.mainloop()
[!NOTE]
event.datais a raw Tcl list, not a Python list or plain string. When multiple files are dropped, their paths come back space-separated in a single string, and any path containing a space is wrapped in{braces}so it can still be told apart from the others. Useroot.tk.splitlist(event.data)(as above) to get a clean Python list of paths — don't split the string yourself, since that will break on braced/spaced paths.
see any of the demos for usage examples.
Framework Integration
If you are using a GUI framework that manages its own Tk root window (such as PySimpleGUI or CustomTkinter), you cannot use TkinterDnD.Tk() as the root. Instead, call TkinterDnD.require() on the framework's existing root after it has been created. This loads tkdnd into the shared Tcl interpreter, making drag-and-drop available to all widgets in the process.
The following are some simple examples:
PySimpleGUI
import PySimpleGUI as sg
from tkinterdnd2 import TkinterDnD, DND_FILES
def on_drop(event):
# event.data is a raw Tcl list; use splitlist to handle multiple/spaced paths, see note above
files = window.TKroot.tk.splitlist(event.data)
window["-FILE-"].update(files[0])
layout = [
[sg.Text("Drag & Drop a File Here")],
[sg.Input("", key="-FILE-")],
[sg.Button("OK"), sg.Button("Cancel")],
]
window = sg.Window("File Drop", layout, finalize=True)
# Inject DnD into PySimpleGUI's own root — no dummy window needed
TkinterDnD.require(window.TKroot)
# Register any widget as a drop target
window["-FILE-"].widget.drop_target_register(DND_FILES)
window["-FILE-"].widget.dnd_bind("<<Drop>>", on_drop)
while True:
event, values = window.read()
if event in (sg.WIN_CLOSED, "Cancel"):
break
window.close()
CustomTkinter
import customtkinter as ctk
from tkinterdnd2 import TkinterDnD, DND_FILES
def on_drop(event):
# event.data is a raw Tcl list; use splitlist to handle multiple/spaced paths, see note above
files = app.tk.splitlist(event.data)
entry.delete(0, "end")
entry.insert(0, files[0])
app = ctk.CTk()
app.title("File Drop")
# Inject DnD into CustomTkinter's root
TkinterDnD.require(app)
entry = ctk.CTkEntry(app, width=400, placeholder_text="Drag a file here...")
entry.pack(padx=20, pady=20)
entry.drop_target_register(DND_FILES)
entry.dnd_bind("<<Drop>>", on_drop)
app.mainloop()
pyinstaller
When using pyinstaller, you should use the hook-tkinterdnd2.py file included to collect the TkDnD binaries and build them into the project. To use it, copy it into the base directory of your project, then run pyinstaller as follows:
pyinstaller -F -w myproject/myproject.py --additional-hooks-dir=.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tkinterdnd2-0.6.2.tar.gz.
File metadata
- Download URL: tkinterdnd2-0.6.2.tar.gz
- Upload date:
- Size: 729.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e015c2d863c9292e61d0294dea43010ff99c3cc9423e564676e04df413de9916
|
|
| MD5 |
32af5d740ac72c699d768d47890eaac6
|
|
| BLAKE2b-256 |
3b68a7400de3c15038522b00540480a1273809ad4680b941e9c5f82520b27f2f
|
File details
Details for the file tkinterdnd2-0.6.2-py3-none-any.whl.
File metadata
- Download URL: tkinterdnd2-0.6.2-py3-none-any.whl
- Upload date:
- Size: 811.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6a8b229d26286c022bb2fbd311c2e431e4d9bbab8133be80e9c98e7bcf9fe59
|
|
| MD5 |
1263f536a42bf2acb8d311aab1b6258d
|
|
| BLAKE2b-256 |
331b039642c212c24887a941af706b006365f3733d88aab383f0cf151768403c
|