Pythonでドラック&ドロップが簡単にできるかどうか試してみたいと思いました。
テキストファイルをドラッグ&ドロップして、その内容を表示します。
ドラッグ&ドロップ(D&D) を実現するために、tkinterdnd2を使います。
実際に書いたコード
import tkinter as tk
from tkinterdnd2 import DND_FILES, TkinterDnD
def drop_file(event):
filepath = event.data.strip("{}") # パスの {} を除去
try:
with open(filepath, "r", encoding="utf-8") as f:
text.delete("1.0", tk.END)
text.insert(tk.END, f.read())
except Exception as e:
text.delete("1.0", tk.END)
text.insert(tk.END, f"読み込みエラー: {e}")
root = TkinterDnD.Tk()
root.title("テキストファイル表示")
text = tk.Text(root, width=60, height=25)
text.pack(padx=10, pady=10)
# ドラッグ&ドロップを受け付ける設定
text.drop_target_register(DND_FILES)
text.dnd_bind("<>", drop_file)
root.mainloop()
コードの解説
1. 全体構成
TkinterDnD.Tk() で D&D 対応ウィンドウを作る
↓
Text ウィジェットを作る
↓
Text に「ファイルドロップを受け付ける」設定をする
↓
Drop イベントが来たら drop_file() が呼ばれる
↓
ファイルを読み込んで Text に表示
2. ライブラリの読み込み
import tkinter as tk
from tkinterdnd2 import DND_FILES, TkinterDnD
✔ tkinter
Python 標準の GUI ライブラリ。
✔ tkinterdnd2
Tkinter に ドラッグ&ドロップ機能を追加する拡張。 Tkinter 単体では D&D ができないので、これが必要。
✔ DND_FILES
「ファイルをドロップする」という種類のイベントを扱うための定数。
✔ TkinterDnD.Tk()
通常の tk.Tk() の代わりに使用。 これにより D&D 対応のウィンドウ になります。
3. ドロップされた時の処理
def drop_file(event):
filepath = event.data.strip("{}") # パスの {} を除去
try:
with open(filepath, "r", encoding="utf-8") as f:
text.delete("1.0", tk.END)
text.insert(tk.END, f.read())
except Exception as e:
text.delete("1.0", tk.END)
text.insert(tk.END, f"読み込みエラー: {e}")
✔ event.data
ドロップされたファイルのパスが入っている。 Windows では {C:/path/file.txt} のように {} が付くので削除。
✔ ファイルを開いて中身を読み込む
text.delete("1.0", tk.END)→ テキストウィジェットを一度クリアtext.insert(tk.END, f.read())→ 読み込んだ内容をそのまま表示
✔ 読み込みに失敗した場合
- ファイルがテキストでない
- 権限がない
- 文字コードが違う
などの時にエラーを表示。
4. ウィンドウの作成
root = TkinterDnD.Tk()
root.title("テキストファイル表示")
text = tk.Text(root, width=60, height=25)
text.pack(padx=10, pady=10)
普通の Tk() では D&D が動かないので注意。
ここにファイルの中身が表示されます。
5. ドラッグ&ドロップの設定
# ドラッグ&ドロップを受け付ける設定
text.drop_target_register(DND_FILES)
text.dnd_bind("<>", drop_file)
「このウィジェットはファイルのドロップを受け付けますよ」という宣言。
ドロップされた時に drop_file() を呼びます。
6. メインループ
root.mainloop()
GUI アプリが動き続けるためのループ。
結果

ウィンドウにテキストの内容が表示されました。


人気ブログランキング ブログパーツ