# 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('<>', _internal_drop_event)