Вот что уж действительно будет часто использоваться, так это перетаскивание файлов из вашего обычного приложения в файловую систему. В прошлой статье про Drag and Drop вы видели пример перетаскивания файлов в ваше приложение. Теперь мы рассмотрим то, как их вытащить оттуда.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Приступая к работе
Скорее всего вы решите использовать виджеты wx.ListCtrl или ObjectListView, так как они наиболее распространённые из тех, что используются для отображения информации. Давайте взглянем на код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
import wx import os import time class MyListCtrl(wx.ListCtrl): def __init__(self, parent, id): wx.ListCtrl.__init__(self, parent, id, style=wx.LC_REPORT) files = os.listdir('.') self.InsertColumn(0, 'Name') self.InsertColumn(1, 'Ext') self.InsertColumn(2, 'Size', wx.LIST_FORMAT_RIGHT) self.InsertColumn(3, 'Modified') self.SetColumnWidth(0, 220) self.SetColumnWidth(1, 70) self.SetColumnWidth(2, 100) self.SetColumnWidth(3, 420) j = 0 for i in files: (name, ext) = os.path.splitext(i) size = os.path.getsize(i) sec = os.path.getmtime(i) self.InsertStringItem(j, "{}{}".format(name, ext)) self.SetStringItem(j, 1, ext) self.SetStringItem(j, 2, str(size) + ' B') self.SetStringItem( j, 3, time.strftime('%Y-%m-%d %H:%M', time.localtime(sec))) if os.path.isdir(i): self.SetItemImage(j, 1) elif 'py' in ext: self.SetItemImage(j, 2) elif 'jpg' in ext: self.SetItemImage(j, 3) elif 'pdf' in ext: self.SetItemImage(j, 4) else: self.SetItemImage(j, 0) if (j % 2) == 0: self.SetItemBackgroundColour(j, 'light blue') j = j + 1 class DnDFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title='DnD Files') panel = wx.Panel(self) p1 = MyListCtrl(panel, -1) p1.Bind(wx.EVT_LIST_BEGIN_DRAG, self.onDrag) sizer = wx.BoxSizer() sizer.Add(p1, 1, wx.EXPAND) panel.SetSizer(sizer) self.Center() self.Show(True) def onDrag(self, event): """""" data = wx.FileDataObject() obj = event.GetEventObject() id = event.GetIndex() filename = obj.GetItem(id).GetText() dirname = os.path.dirname(os.path.abspath( os.listdir(".")[0])) fullpath = os.path.join(dirname, filename) data.AddFile(fullpath) dropSource = wx.DropSource(obj) dropSource.SetData(data) result = dropSource.DoDragDrop() print(fullpath) if __name__ == '__main__': app = wx.App(False) frame = DnDFrame() app.MainLoop() |
Здесь есть несколько важных мест. Для начала, вам нужно забиндить EVT_LIST_BEGIN_DRAG, чтобы обнаружить соответствующее событие. Затем ваш хэндлер должен создать объект wx.FileDataObject и использовать метод AddFile, чтобы присоединить весь путь к внутреннему списку файлов.
Согласно документации wxPython, AddFile был создан только для Windows. Как бы то ни было, так как Робин Дан (создатель wxPython) рекомендует данный метод, я буду использовать именно его. Хочу лишь отметить, что у меня он работал также и на Xubuntu 14.04. В любом случае, нам также нужно определить DropSource и вызвать его метод DoDragDrop, и вот теперь вы закончили.
Итоги
К этому месту вы уже должны иметь представление о том, как перетаскивать файлы из вашего приложения в файловую систему или прямо на рабочий стол. Это довольно просто, но подобная возможность точно расширит функционал вашего приложения и сделает его более привлекательным для конечного пользователя.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»