python:: tkinter _ external files drag and drop

*유의사항 :: vscode를 "관리자 권한" 으로 실행시키면 정상작동 안함, user권한으로 실행 필요함

실행하면 금지표지만 표시 뜸        

 

(준비사항) 

> pip install tkinterdnd2

 

* 1개 모듈만 설치하면 됨. 다른 글에 2개 설치하는 것 불필요

* 사용하는 문구는 모두 "소문자" 여야 함. 코드도 소문자여야 함.

    import tkinterdnd2

 

 

 

실행예제

 

실행예제1)

# https://github.com/Eliav2/tkinterdnd2
# pip install tkinterdnd2

import tkinter as tk

from tkinterdnd2 import DND_FILES, TkinterDnD

def drop_inside_list_box(event):
    listb.insert("end", event.data)

def drop_inside_textbox(event):
    tbox.delete("1.0","end")
    if event.data.endswith(".txt"):
        with open(event.data, "r") as file:
            for line in file:
                line = line.strip()
                tbox.insert("end", f"{line}\n")

root = TkinterDnD.Tk()
root.geometry("500x500")

listb = tk.Listbox(root, selectmode=tk.SINGLE, background="#ffe0d6")
listb.pack(fill=tk.X)
listb.drop_target_register(DND_FILES)
listb.dnd_bind("<<Drop>>", drop_inside_list_box)

tbox = tk.Text(root)
tbox.pack()
tbox.drop_target_register(DND_FILES)
tbox.dnd_bind("<<Drop>>", drop_inside_textbox)

root.mainloop()

 

 

 

 


 

실행예제2)

from tkinter import *
from tkinterdnd2 import *
from PIL import ImageTk,Image

def DropImage(event):
    testvariable.set(event.data)
    # get the value from string variable
    window.file_name=testvariable.get()
    # takes path using dragged file
    image_path = Image.open(str(window.file_name))
    # resize image
    reside_image = image_path.resize((300, 205), Image.ANTIALIAS)
    # displays an image
    window.image = ImageTk.PhotoImage(reside_image)
    image_label = Label(labelframe, image=window.image).pack()

window = TkinterDnD.Tk()
window.title('Delftstack')
window.geometry('400x300')
window.config(bg='gold')

testvariable = StringVar()
textlabel=Label(window, text='drop the file here', bg='#fcba03')
textlabel.pack(anchor=NW, padx=10)
entrybox = Entry(window, textvar=testvariable, width=80)
entrybox.pack(fill=X, padx=10)
entrybox.drop_target_register(DND_FILES)
entrybox.dnd_bind('<<Drop>>', DropImage)

labelframe = LabelFrame(window, bg='gold')

labelframe.pack(fill=BOTH, expand=True, padx=9, pady=9)

window.mainloop()

 

 

 

 

 

 

 


pip install

 

설치는 아래 문구를 이용해서 설치하면 됨.

pip install tkinterdnd2

https://pypi.org/project/tkinterdnd2/

 

tkinterdnd2

TkinterDnD2 is a python wrapper for George Petasis'' tkDnD Tk extension version 2

pypi.org

 

 

기존에 다른 예제들, Reference를 보면(본문 하단에 모아둠)

2가지 모듈을 별도로 설치하게 되어 있음.

- tkdnd2.8   (https://sourceforge.net/projects/tkdnd/files/Windows%20Binaries/TkDND%202.8/)

- TkinterDnD2    (https://sourceforge.net/projects/tkinterdnd/files/TkinterDnD2/)

 

이 방법 또한 실행되지만, venv를 사용하거나 환경이 여러개가 되면 설치하기가 번거로움.

그래서 아래 어떤 사람이 pip install하게끔. pypi.org에 올려주고 기존 것과 헷갈리지 않게  이름을 "소문자"로 바꿈 

이 때 DnD2 코드작성자에게 연락했는데, 대답이 없었는지 본인이 github repo를 fork하고 그냥 올림.

 

추가로, 원래 코드들은 tkdnd2.8 (version 2.8)을 사용하는데 pip install 버전(소문자 버전)은 version 2.9를 적용하고 별도의 복사하는 과정이 불필요함. 소문자 tkinterdnd2를 pip로 설치하면서 환경(win/mac/linux)에 따라서 자동으로 tkdnd2.9를 설치하게끔 되어 있음.

 

>> 결론은 편하게 쓰자~

 

 

https://github.com/Eliav2/tkinterdnd2

 

GitHub - Eliav2/tkinterdnd2: Tkinter native drag and drop support for windows, unix and Mac OSX.

Tkinter native drag and drop support for windows, unix and Mac OSX. - GitHub - Eliav2/tkinterdnd2: Tkinter native drag and drop support for windows, unix and Mac OSX.

github.com

 

 

 

 

 

 

 


 

Reference

 

 

https://stackoverflow.com/questions/69348567/pyinstaller-tkdnd-tkinterdnd2-unable-to-load-tkdnd-library-when-launching-fr

 

PyInstaller + tkdnd/tkinterdnd2 "Unable to load tkdnd library" when launching frozen exe. Works when launched from script

In my script I am using tkinterdnd2 library to achieve drag and drop functionality from Windows explorer into my tkinter UI. from tkinterdnd2 import TkinterDnD, DND_FILES import tkinter as tk class

stackoverflow.com

 

 

 

네이버 블로그가 참 친절하게 써두셨다. 하지만... 그냥 새롭게 쓰는 사람들은 pip install로 설치해서 쓰자.

https://m.blog.naver.com/ejmhuse2/222292369485

 

Tkinter Drag & Drop(DnD) 리스트박스 적용 방법

Drag & Drop는 고난도 기술이기 때문에 직접 코딩하기에는 제 능력이 안됩니다. 하지만 대부분 자주 ...

blog.naver.com

 

 

 

https://pythonguides.com/python-tkinter-drag-and-drop/

 

Python Tkinter Drag And Drop - Python Guides

This Python tutorial explains, Python Tkinter drag and drop and how to drag and drop widgets on the screen using Python Tkinter. Python Tkinter Drag and Drop Listbox.

pythonguides.com

 

 

 

 

https://www.youtube.com/watch?v=JIy0QjwQBl0

 

 

 

 

 

_

반응형