Update v5.0
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user