mieki256's diary



2015/06/18(木) [n年前の日記]

#4 [python] Python + Tkinter でドラッグアンドドロップ

Windowsのエクスプローラから、Python + Tkinter で表示してるウインドウにファイルをD&Dして、ファイルパスを取得したいなと。

ググってみたら、Python + Tkinter、というか Tk は、標準ではそんな機能を持ってないらしい。

しかし、ちょっと頑張ればなんとかなるのかもしれないという話もあるようで。せっかく調べたので、そのあたりをメモ。

環境は Windows7 x64 + Python 2.7.10。

Win32 APIとやらを使う。 :

_Python+TkでD&D - MasaHeroの日記 で解説されてた。ソースをコピペして試してみたら、たしかにD&Dしたファイルのパスを取得することができた。素晴らしい…。

もちろん、この方法だと Windows専用アプリになるわけで。であれば、もしかすると IronPython + .NET Framework で作ってしまうという選択肢もアリになってくるのかしら。Tkinter を使うことで、Windows以外の環境でも動かせる可能性が、という話は無くなってしまうよなと。

TkDNDを使う。 :

TkだけではD&Dに対応してないけど、Tkの拡張として TkDND なるものがあって、ソレを使うとD&Dができるらしい。

_Scripting Laboratory: tkDND

TkDNDは、 _TkDND download | SourceForge.net から入手できる。 _Files_Windows Binaries_TkDND 2.8 と辿って、tkdnd2.8-win32-ix86.tar.gz を入手。

解凍したら、以下のファイルが入っていた。
└─tkdnd2.8
        libtkdnd2.8.dll
        pkgIndex.tcl
        tkdnd.tcl
        tkdnd_compat.tcl
        tkdnd_generic.tcl
        tkdnd_macosx.tcl
        tkdnd_unix.tcl
        tkdnd_windows.tcl

インストール方法がさっぱり分からなくて困ったけれど。 _tkinterでドラッグ&ドロップ - None is None is None でインストール場所について言及しているのを発見。

要は、Python2.7インストール場所\tcl\ フォルダの下に tkdnd というフォルダを作って、その中に先ほど入手した *.dll、*.tcl を全部突っ込めばいいらしい。

*.dll だけあればいいんじゃないのと最初は思ったけど、どうも pkgIndex.tcl というファイルで、「この拡張を使う時は、このファイルを使え」的な情報が書かれている気配があって。よく分からないから *.tcl も全部突っ込む。

さらに、Python + Tkinter から使うためには、TkDND のラッパーとやらが必要になるそうで。それについては、 _Drag and drop in Windows - Google グループ 経由で、 _TkinterDnD download | SourceForge.net にサンプルとラッパーがあると知った。Files → TkinterDnD2 と辿って、TkinterDnd2-0.1.zip を入手。

解凍すると、中に色々ファイルが。
D:.
│  test.py
│  TkinterDnD.html
│
└─TkinterDnD2
        TkinterDnD.py
        __init__.py

test.py を実行したら…。たしかに、エクスプローラからファイルをD&Dしてファイルのパスを取得することができた。

しかし、このままではちと使いづらい気もする。Pythonインストールフォルダに件のファイル群を手作業でコピーさせるのってどうなんだろうと。自分の環境だけで使う分にはいいけれど、他の環境でも使えるようにと考え始めると、ソレってちょっとどうなのよと。

_python drag and drop explorer files to tkinter entry widget - Stack Overflow で、またちょっと違うラッパー、untested_tkdnd_wrapper.py が公開されてた。untested_tkdnd_wrapper.py を呼び出す側のスクリプト内で、TkDNDがどこにあるかを指定できるらしい。

試しに、untested_tkdnd_wrapper.py、及び、呼び出すスクリプトがある場所に、tkdnd というフォルダを作って、TkDND の *.dll、*.tcl をコピーして。呼び出す側のスクリプトの最初のあたりを、
os.environ['TKDND_LIBRARY'] = DIRECTORYTOTHETKDNDBINARY
↓
os.environ['TKDND_LIBRARY'] = ".\\tkdnd"
と修正。

これで試してみたところ、こちらもD&Dでファイルパスを取得できた。

つまり、ラッパーの書き方次第で、スクリプトと一緒に関連ファイルをフォルダごと同梱して使える状態にできそうだなと。

ただ、ライセンスはどうなるのか分かってないけど。

_TkDND 自体は、BSD License と書いてあるな…。

以上です。

過去ログ表示

Prev - 2015/06 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project