*유의사항 :: 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/
기존에 다른 예제들, 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
Reference
네이버 블로그가 참 친절하게 써두셨다. 하지만... 그냥 새롭게 쓰는 사람들은 pip install로 설치해서 쓰자.
https://m.blog.naver.com/ejmhuse2/222292369485
https://pythonguides.com/python-tkinter-drag-and-drop/
https://www.youtube.com/watch?v=JIy0QjwQBl0
_