Форум сайта python.su
Всем привет.
Есть задача реализовать перетаскивание прикрепленных к сообщениям файлов из аутлука в приложение на wx.
К примеру, перетащить их в проводник виндас можно, а в свое приложение никак не могу реализовать.
Нарыл вот такой код:
# -*- coding: cp1251 -*-
import wx
import win32clipboard
import win32api
import win32con
class Frame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
self.panel = wx.Panel(self)
dt = DropTarget()
self.panel.SetDropTarget(dt)
class DropTarget(wx.PyDropTarget):
def __init__(self):
wx.PyDropTarget.__init__(self)
self.do = wx.DataObjectComposite()
self.textdo = wx.TextDataObject()
self.filedo = wx.FileDataObject()
self.targetdo = wx.PyDataObjectSimple(format = wx.DataFormat(0xc00e))
self.do.Add(self.textdo)
self.do.Add(self.filedo)
self.do.Add(self.targetdo)
self.SetDataObject(self.do)
def OnData(self, x, y, drag_result):
if self.GetData():
df = self.do.GetReceivedFormat().GetType()
print df
if df in [wx.DF_UNICODETEXT, wx.DF_TEXT]:
win32clipboard.OpenClipboard(0)
data=win32clipboard.GetClipboardData(win32con.CF_HDROP)
win32clipboard.CloseClipboard()
tfile = win32api.DragQueryFile(drag_result)
# elif df == wx.DF_FILENAME:
# for name in self.filedo.GetFilenames():
# print name
return drag_result
class App(wx.App):
def __init__(self):
wx.App.__init__(self)
self.frame = Frame(None)
self.frame.Show()
if __name__ == "__main__":
app = App()
app.MainLoop()
Офлайн
При замене строк
# self.targetdo = wx.PyDataObjectSimple(format = wx.DataFormat(0xc00e))
self.targetdo = wx.CustomDataObject("FileGroupDescriptor")
Офлайн
получение имени файла
def OnData(self, x, y, drag_result):
if self.GetData():
df = self.do.GetReceivedFormat().GetType()
print df
ds = self.targetdo.GetDataSize()
d = self.targetdo.Data
filename = ""
for i in range(76, ds-1):
if d[i] != "":
filename += d[i]
print filename, len(filename)
Офлайн
вот и ответ на мой вопрос…wxPython такого не позволяет.
http://wxpython-users.1045709.n5.nabble.com/Drag-and-Drop-in-MS-Windows-td2310230.html
Офлайн
Добил я эту тему…
Раз уж перетаскивать прикрепленные файлы не возможно, то сделал так: перетаскивается письмо, я его принимаю, нахожу в аутлуке в списке писем и оттуда получаю аттачи.
Код позже скину, а то щас чета впадлу пример готовить :-)
Офлайн
По идее можно делать свой класс для перетаскиваемых объектов, если стандартные классы не подходят (см. класс PyDropTarget), но сходу не соображу, поможет это здесь или нет.
Офлайн
Jenyay
Свой класс не поможет. Дело в том, что аутлук хранит аттачи не как отдельный файл на диске, а в теле письма (вроде). При перетаскивании он (аутлук) готов передает имя файла и его контент. При событии OnDragEnter нужно указать приложению скопировать контент в память для последующего использования (что успешно реализуется на C#), а wxPython такого не позволяет. Разработчик рекомендует попробовать pywin. Вот поэтому я пошел таким обходным путем.
Офлайн