Форум сайта python.su
0
Всем привет.
Есть задача реализовать перетаскивание прикрепленных к сообщениям файлов из аутлука в приложение на 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()
Офлайн
0
При замене строк
# self.targetdo = wx.PyDataObjectSimple(format = wx.DataFormat(0xc00e))
self.targetdo = wx.CustomDataObject("FileGroupDescriptor")
Офлайн
0
получение имени файла
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)
Офлайн
0
вот и ответ на мой вопрос…wxPython такого не позволяет.
http://wxpython-users.1045709.n5.nabble.com/Drag-and-Drop-in-MS-Windows-td2310230.html
Офлайн
0
Добил я эту тему…
Раз уж перетаскивать прикрепленные файлы не возможно, то сделал так: перетаскивается письмо, я его принимаю, нахожу в аутлуке в списке писем и оттуда получаю аттачи.
Код позже скину, а то щас чета впадлу пример готовить :-)
Офлайн
1
По идее можно делать свой класс для перетаскиваемых объектов, если стандартные классы не подходят (см. класс PyDropTarget), но сходу не соображу, поможет это здесь или нет.
Офлайн
0
Jenyay
Свой класс не поможет. Дело в том, что аутлук хранит аттачи не как отдельный файл на диске, а в теле письма (вроде). При перетаскивании он (аутлук) готов передает имя файла и его контент. При событии OnDragEnter нужно указать приложению скопировать контент в память для последующего использования (что успешно реализуется на C#), а wxPython такого не позволяет. Разработчик рекомендует попробовать pywin. Вот поэтому я пошел таким обходным путем.
Офлайн