Найти - Пользователи
Полная версия: wxPython Drag&Drop from MS Outlook
Начало » GUI » wxPython Drag&Drop from MS Outlook
1
hellslade
Всем привет.
Есть задача реализовать перетаскивание прикрепленных к сообщениям файлов из аутлука в приложение на 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()
не работает. Текст, файлы из проводника принимает, а вот прикрепленные к письмам файлы не хочет.
Делал кто-нибудь такую штуку? Сможет кто помочь? Я уже запарился.. Спасибо.
hellslade
При замене строк
        # self.targetdo = wx.PyDataObjectSimple(format = wx.DataFormat(0xc00e))
self.targetdo = wx.CustomDataObject("FileGroupDescriptor")
уже становится доступен drop. Осталось получить имя файла и его содержимое (или путь к файлу) никто не в курсе?
hellslade
получение имени файла
    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)
hellslade
вот и ответ на мой вопрос…wxPython такого не позволяет.
http://wxpython-users.1045709.n5.nabble.com/Drag-and-Drop-in-MS-Windows-td2310230.html
hellslade
Добил я эту тему…
Раз уж перетаскивать прикрепленные файлы не возможно, то сделал так: перетаскивается письмо, я его принимаю, нахожу в аутлуке в списке писем и оттуда получаю аттачи.
Код позже скину, а то щас чета впадлу пример готовить :-)
Jenyay
По идее можно делать свой класс для перетаскиваемых объектов, если стандартные классы не подходят (см. класс PyDropTarget), но сходу не соображу, поможет это здесь или нет.
hellslade
Jenyay
Свой класс не поможет. Дело в том, что аутлук хранит аттачи не как отдельный файл на диске, а в теле письма (вроде). При перетаскивании он (аутлук) готов передает имя файла и его контент. При событии OnDragEnter нужно указать приложению скопировать контент в память для последующего использования (что успешно реализуется на C#), а wxPython такого не позволяет. Разработчик рекомендует попробовать pywin. Вот поэтому я пошел таким обходным путем.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB