38 lines
1.4 KiB
Python
38 lines
1.4 KiB
Python
# drag_drop.py
|
|
from customtkinter import CTk
|
|
from tkinterdnd2 import DND_ALL, TkinterDnD
|
|
|
|
# 1. Clase envoltorio que combina CustomTkinter con TkinterDnD
|
|
|
|
|
|
class DnDCTk(CTk, TkinterDnD.DnDWrapper):
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.TkdndVersion = TkinterDnD._require(self)
|
|
|
|
# 2. Función para registrar widgets y conectar tu lógica
|
|
|
|
|
|
def enable_drag_and_drop(window, target_widgets, callback_function):
|
|
"""
|
|
Activa Drag & Drop en los widgets especificados.
|
|
|
|
:param window: La ventana principal (debe ser instancia de DnDCTk)
|
|
:param target_widgets: Lista de widgets (botones, labels) donde se pueden soltar archivos.
|
|
:param callback_function: La función de tu app principal que recibe la lista de archivos.
|
|
"""
|
|
|
|
def _internal_drop_event(event):
|
|
# TkinterDnD a veces devuelve las rutas con llaves {} si tienen espacios
|
|
# window.tk.splitlist se encarga de limpiarlas correctamente
|
|
if event.data:
|
|
files = window.tk.splitlist(event.data)
|
|
# Llamamos a tu función principal pasando la lista limpia
|
|
callback_function(files)
|
|
|
|
for widget in target_widgets:
|
|
# Registramos el widget para aceptar cualquier cosa (archivos)
|
|
widget.drop_target_register(DND_ALL)
|
|
# Conectamos el evento 'Drop' con nuestra función interna
|
|
widget.dnd_bind('<<Drop>>', _internal_drop_event)
|