Files
Warlock-Studio-Universal/drag_drop.py
T
Iván Eduardo Chavez Ayub 9eb66b0cac Update v5.0
2025-11-22 15:38:00 -06:00

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)