LoginSignup
13
13

More than 1 year has passed since last update.

tkinter でドラッグアンドドロップ!

Posted at

ファイルをドラッグアンドドロップするだけで結果が見えるプログラムを作りたい!

ファイルを加工したいとき、ファイルを分析したいとき、投げ込むだけで動作する方が効率的だと思ったのでまずは雛形を作ってみました!

実行環境

環境作成

Miniconda(Anaconda) を使って環境作成を行いました。
pip で tkinterdnd2 をインストールしています。

conda create -n dev39 python=3.9 pyinstaller
conda activate dev39
pip install tkinterdnd2

コード

以下に、作成したコードを記載します。
実行と加工は自己責任でお願いします。

import tkinter as tk
from tkinterdnd2 import DND_FILES, TkinterDnD

class MyApp(TkinterDnD.Tk):
    def __init__(self):
        super().__init__()

        ## ウィンドウサイズ
        width = 300
        height = 100
        self.geometry(f'{width}x{height}')
        self.minsize(width, height)
        self.maxsize(width, height)
        self.title(f'DnD')

        ## フレーム
        self.frame_drag_drop = frameDragAndDrop(self)

        ## 配置
        self.frame_drag_drop.grid(column=0, row=0, padx=5, pady=5, sticky=(tk.E, tk.W, tk.S, tk.N))
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)


class frameDragAndDrop(tk.LabelFrame):
    def __init__(self, parent):
        super().__init__(parent)
        self.textbox = tk.Text(self)
        self.textbox.insert(0.0, "Drag and Drop")
        self.textbox.configure(state='disabled')

        ## ドラッグアンドドロップ
        self.textbox.drop_target_register(DND_FILES)
        self.textbox.dnd_bind('<<Drop>>', self.funcDragAndDrop)

        ## スクロールバー設定
        self.scrollbar = tk.Scrollbar(self, orient=tk.VERTICAL, command=self.textbox.yview)
        self.textbox['yscrollcommand'] = self.scrollbar.set

        ## 配置
        self.textbox.grid(column=0, row=0, sticky=(tk.E, tk.W, tk.S, tk.N))
        self.scrollbar.grid(row=0, column=1, sticky=(tk.N, tk.S))
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)

    def funcDragAndDrop(self, e):
        ## ここを編集してください
        message = '\n' + e.data

        self.textbox.configure(state='normal')
        self.textbox.insert(tk.END, message)
        self.textbox.configure(state='disabled')

        self.textbox.see(tk.END)


if __name__ == "__main__":
    app = MyApp()
    app.mainloop()

実行結果

ファイルを投入すると、ファイル名を取得して textbox へ追加します。
そのため、funcDragAndDrop を編集すれば、ファイルを投入すると必要な結果が帰ってくるアプリケーションになる...はずです。

screenshot.png

exe 化

pyinstaller を使って exe 化も試してみました。
--collect-data がないと tkinterdnd2 がパッケージングされないのかエラーが表示されてしまいました。

pyinstaller tksample.py --onefile --noconsole --collect-data tkinterdnd2
13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13