Tkinter:ドラッグ&ドロップ対応法

2015-06-28 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での blogramのランクインカテゴリは、
5、2、1、0、0、 1、0、0、0、0(41)で、換算ポイント 73pt 。
一昨日午後「グルコサミン」「FM COCOLO」「Firefox」でbg値若干アップ。
昨日朝方「Firefox」が6位にダウン。夜「化学業界」2位にダウン。
その他「グルコサミン」「Firefox」でbg値アップ/ダウン。
「C言語」「Perl」「Python」は全く変化無かった。
・-・ - -・

さて、本文。

これまで、“Tkinter”でドラッグ&ドロップした“ファイル名”を
取得する方法は分からなかった。

と云うか、出来ないことだと思っていた。

関係する過去記事


ところが???

以前(2015-03-15)の記事:「GUI アプリ は PyQt4 に決め
の如く、“PyQt4”に決めてはいるが、

“Tkinter”に未練があり、探していたら、・・・・・
見つけた:「Python CaseStudy」の
TkinterでDrag&Drop(ctypes使用)
  python3.2を使用。
  pywin32を使用せず、ctypesのみで
  tkinterで表示したウィンドウに対して
  ドラッグ&ドロップできるようにするコード。
  Windows限定で64bitの場合は、
  ctypesの変数宣言を64bit用に変更する必要がある。
  ・・・・・
  ・・・・・


但し、

  def py_drop_func(hwnd, msg, wp, lp):

の関数定義内のコメントに:

  WinProcのプロトタイプ
  ファイルのドラッグアンドドロップイベント(WM_DROPFILES)を検出して、
  ドロップされたファイルを保存する。
  ここでウィンドウ(tk)を使用するとハングアップするので
  データ保存だけ行う。

とある。

良く理解出来なかったが、
頑張って、
参照記事のコードを改変してみた。

import Tkinter as Tk
import sys
from ctypes.wintypes import HWND, UINT, WPARAM, LPARAM
import ctypes as ct

prototype = ct.WINFUNCTYPE( ct.c_long, HWND, UINT, WPARAM, LPARAM )
WM_DROPFILES = 0x0233; GWL_WNDPROC = -4; WINPROC = None

def py_drop_func( hwnd, msg, wp, lp ):
global dropname
if msg == WM_DROPFILES:
ct.windll.shell32.DragQueryFile( wp, -1, None, None )
szFile = ct.c_buffer(260)
ct.windll.shell32.DragQueryFile( wp, 0, szFile, ct.sizeof(szFile) )
dropname = szFile.value.decode( sys.getfilesystemencoding() )
ct.windll.shell32.DragFinish( wp )
return ct.windll.user32.CallWindowProcW( WINPROC, hwnd, msg, wp, lp )

def dropfile():
global dropname, sub_win, vab
if dropname is not None:
### print dropname
if dropname != vba:
va.set(dropname)
vab = dropname
if sub_win is not None and sub_win.winfo_exists():
sub_win.destroy()
if sub_win is None or not sub_win.winfo_exists():
sub_win = Tk.Toplevel()
sub_win.title( 'About' )
Tk.Label( sub_win, text=dropname ).pack()
app.after( 1000, dropfile )

dropname = None; sub_win = None; vab = ''

app = Tk.Tk()
va=Tk.StringVar(); va.set('***')
Tk.Label( app, textvariable=va ).pack()

app2 = Tk.Toplevel()
app2.title( 'DnD' )
hwnd = app2.winfo_id()
ct.windll.shell32.DragAcceptFiles( hwnd, True )
WINPROC = ct.windll.user32.GetWindowLongW( hwnd, GWL_WNDPROC )
drop_func = prototype( py_drop_func )
ct.windll.user32.SetWindowLongW( hwnd, GWL_WNDPROC, drop_func )

app.after( 1000, dropfile )
if dropname != vab:
va.set(dropname)
vab = dropname
app.mainloop()


の様に、
別窓で“ドラッグ&ドロップ”を受け付け、
その結果を、
メインの窓で、(tk)を使う。

これで何とか出来る???


本日はここまで。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


150521,24
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
09 | 2017/10 | 11
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 31 - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク