Уведомления

Группа в Telegram: @pythonsu

#1 Март 4, 2011 07:27:41

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython Drag&Drop from MS Outlook

Всем привет.
Есть задача реализовать перетаскивание прикрепленных к сообщениям файлов из аутлука в приложение на 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()
не работает. Текст, файлы из проводника принимает, а вот прикрепленные к письмам файлы не хочет.
Делал кто-нибудь такую штуку? Сможет кто помочь? Я уже запарился.. Спасибо.



Офлайн

#2 Март 4, 2011 09:22:03

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython Drag&Drop from MS Outlook

При замене строк

        # self.targetdo = wx.PyDataObjectSimple(format = wx.DataFormat(0xc00e))
self.targetdo = wx.CustomDataObject("FileGroupDescriptor")
уже становится доступен drop. Осталось получить имя файла и его содержимое (или путь к файлу) никто не в курсе?



Офлайн

#3 Март 4, 2011 09:37:21

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython Drag&Drop from MS Outlook

получение имени файла

    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)



Офлайн

#4 Март 5, 2011 13:35:27

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython Drag&Drop from MS Outlook

вот и ответ на мой вопрос…wxPython такого не позволяет.
http://wxpython-users.1045709.n5.nabble.com/Drag-and-Drop-in-MS-Windows-td2310230.html



Офлайн

#5 Март 10, 2011 14:26:44

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython Drag&Drop from MS Outlook

Добил я эту тему…
Раз уж перетаскивать прикрепленные файлы не возможно, то сделал так: перетаскивается письмо, я его принимаю, нахожу в аутлуке в списке писем и оттуда получаю аттачи.
Код позже скину, а то щас чета впадлу пример готовить :-)



Офлайн

#6 Март 11, 2011 21:00:14

Jenyay
От:
Зарегистрирован: 2007-08-10
Сообщения: 173
Репутация: +  1  -
Профиль   Отправить e-mail  

wxPython Drag&Drop from MS Outlook

По идее можно делать свой класс для перетаскиваемых объектов, если стандартные классы не подходят (см. класс PyDropTarget), но сходу не соображу, поможет это здесь или нет.



Офлайн

#7 Март 14, 2011 06:26:33

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython Drag&Drop from MS Outlook

Jenyay
Свой класс не поможет. Дело в том, что аутлук хранит аттачи не как отдельный файл на диске, а в теле письма (вроде). При перетаскивании он (аутлук) готов передает имя файла и его контент. При событии OnDragEnter нужно указать приложению скопировать контент в память для последующего использования (что успешно реализуется на C#), а wxPython такого не позволяет. Разработчик рекомендует попробовать pywin. Вот поэтому я пошел таким обходным путем.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version