Python怎么使用拖拽文件相关的Windows API?

随风而行lulu 2015-06-21 04:26:03
用Tkinter写了一个GUI程序。没实现文件拖放,网上搜索到几个拖放的资料



#coding:gbk
from Tkinter import *
import win32gui
import win32ui
import win32api
import win32con

class App(Frame):
def __init__(self, master):
Frame.__init__(self, master=master)
self.master.title('note')
self.top=self.winfo_toplevel()
self.master=master
self.files=[]
self.mkwidgets()
self.master.protocol('WM_DROPFILES', self.OnDropFiles)
self.master.geometry('%dx%d+%d+%d' % (400,200,50,50))

#以下代码参考:
#http://bytes.com/topic/python/answers/855640-hooking-windowsmessages-python

self.hwnd = eval(self.master.wm_frame())
#toplevel.wm_frame():Return identifier for decorative frame of this widget if present.

print 'hwnd:%s, title:%s' % (self.hwnd, win32gui.GetWindowText(self.hwnd))
#title为空

#设置窗口允许接收拖放的文件
win32gui.DragAcceptFiles(self.hwnd, 1)

self.wnd = win32ui.CreateWindowFromHandle(self.hwnd)
#win32ui模块的方法,而非win32gui
self.wnd.HookMessage(self.OnDropFiles, win32con.WM_DROPFILES)
#上面这句和下面这句有什么区别?
#self.master.protocol('WM_DROPFILES', self.OnDropFiles)
#为什么捕获不到WM_DROPFILES消息?

def mkwidgets(self):
self.e=Entry(self.top)
self.e.pack()
self.b=Button(self.top, text='hi', command=self.click)
self.b.pack()
#self.after_idle(self.bindx)

def click(self):
print self.files
self.hwnd = eval(self.master.wm_frame())
print 'hwnd:%s, title:%s' % (self.hwnd, win32gui.GetWindowText(self.hwnd))

def OnDropFiles(self,msg=None):
#响应拖放消息的方法
#这个方法从来没有被执行
print 'Drag and drop'

filenamebuffering=''
#获取拖放的文件总数
#hDropInfo=msg[2]
hDropInfo=win32con.WM_DROPFILES
#filescount = win32gui.DragQueryFile(win32con.WM_DROPFILES, 0xFFFFFFFF, None, 0)
filescount = win32api.DragQueryFile(win32con.WM_DROPFILES, 0xFFFFFFFF, None, 0)
#filescount = win32api.DragQueryFile(hDropInfo)

for i in range(filescount):
#获取文件名
#filename=win32gui.DragQueryFile(hDropInfo, i, filenamebuffering, 100)
filename=win32api.DragQueryFile(hDropInfo, i, filenamebuffering, 100)
#filename=win32api.DragQueryFile(hDropInfo, i)
#保存文件名
self.files.append(filename)
#清除缓存
win32gui.DragFinish(hDropInfo)
return 0


if __name__=='__main__':
root=Tk()
app=App(root)
#Entry(root).pack()
app.mainloop()

'''关于HookMessage还有一个相关的网页,里面的代码如下
http://www.gossamer-threads.com/lists/python/python/5723

from pywin.framework import dlgappcore, app
import win32ui, win32con, win32api
import sys
import regsub

class DropScriptDialogApp(dlgappcore.DialogApp):
def CreateDialog(self):
return DropScriptAppDialog()

class DropScriptAppDialog(dlgappcore.AppDialog):
def __init__(self):
self.edit = None
dlgappcore.AppDialog.__init__(self, win32ui.IDD_LARGE_EDIT)

def OnInitDialog(self):
self.SetWindowText('Drop script application')
self.edit = self.GetDlgItem(win32ui.IDC_EDIT1)
self.DragAcceptFiles()
#如果使用其他GUI框架,比如Tkinter,HookMessage()方法怎么用?
self.HookMessage(self.OnDropFiles, win32con.WM_DROPFILES)
return 1

def OnDropFiles(self, msg):
hDropInfo = msg[2]
nFiles = win32api.DragQueryFile(hDropInfo)
try:
for iFile in range(0, nFiles):
fileName = win32api.DragQueryFile(hDropInfo, iFile)
print '%s dropped...' % fileName
finally:
win32api.DragFinish(hDropInfo)
return 0

def PreDoModal(self):
sys.stdout = sys.stderr = self

def write(self, str):
if self.edit:
self.edit.SetSel(-2)
# translate \n to \n\r
self.edit.ReplaceSel(regsub.gsub('\n','\r\n',str))
else:
win32ui.OutputDebug(
'dlgapp - no edit control! >>\n%s\n<<\n' % str )

app.AppBuilder = DropScriptDialogApp

if __name__=='__main__':
import demoutils
demoutils.NeedApp()
'''
...全文
1772 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cilame 2018-05-30
  • 打赏
  • 举报
回复
pip install windnd import windnd import tkinter top = tkinter.Tk() txt = tkinter.Text(top) # 对文件的操作 def func(ls): txt.delete(0.,"end") for i in ls: txt.insert("end",i.decode("gbk")+'\n') # windows 挂钩 windnd.hook_dropfiles(txt.winfo_id(),func) txt.pack(side="top") top.mainloop()
StaticTemp 2015-12-10
  • 打赏
  • 举报
回复
我认为这篇文章讲得更简单实用。http://blog.csdn.net/eijnew/article/details/6695271#comments
随风而行lulu 2015-06-30
  • 打赏
  • 举报
回复
引用 3 楼 sprawling的回复:
真的可以.我试过了,能拖进去,楼主可以参考一下.
我搜索Tkinter 拖放,没有一个结果提到Tkdnd 。我在so上面找了个例子
随风而行lulu 2015-06-23
  • 打赏
  • 举报
回复
帮忙看下,求大神支招
sprawling 2015-06-23
  • 打赏
  • 举报
回复
真的可以.我试过了,能拖进去,楼主可以参考一下.
sprawling 2015-06-23
  • 打赏
  • 举报
回复
不知道楼主引用了那些帖子,我看论坛上面有介绍用tkdnd插件的. https://mail.python.org/pipermail/tkinter-discuss/2005-July/000476.html 有时间我试试,也和楼主分享一下.

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧