Search code examples
pythontkintertkinter-text

TkinterDnD2 return value


I'm trying to make a tkinterdnd function that when called on can allow the user to drag and drop a file into the box, and when the box is closed it returns the file path for the file put in as event_data.

How do I get it to return this value if it is in the box?

def get_file_gui():
    def show_text(event):
        textarea.delete("1.0","end")
        textarea.insert("end",f"{event.data}\n")
        return event.data

    root=TkinterDnD.Tk()
    root.title("EFT Secure File Transfer")
    root.geometry('400x300')

    frame=Frame(root)
    frame.pack()

    textarea=Text(frame, height=30, width=40)
    textarea.pack(side=LEFT)
    textarea.drop_target_register(DND_FILES)
    textarea.dnd_bind('<<BIND>>', show_text)

    root.mainloop()
    return event_data

Solution

  • You can create a local variable event_data inside get_file_gui() and update it inside nested function show_text():

    def get_file_gui():
        event_data = None  # create and initialize "event_data"
    
        def show_text(event):
            nonlocal event_data
            event_data = event.data  # update "event_data"
            textarea.delete("1.0", "end")
            textarea.insert("end", f"{event.data}\n")
    
        root = TkinterDnD.Tk()
        root.title("EFT Secure File Transfer")
        root.geometry('400x300')
    
        frame = Frame(root)
        frame.pack()
    
        textarea = Text(frame, height=30, width=40)
        textarea.pack(side=LEFT)
        textarea.drop_target_register(DND_FILES)
        textarea.dnd_bind('<<Drop>>', show_text) # bind "<<Drop>>" instead of "<<BIND>>"
    
        root.mainloop()
        return event_data