|
|
| Строка 1: |
Строка 1: |
| - | Wikipedia:
| |
| | | | |
| - | In computer graphical user interfaces, drag-and-drop is the action of (or support for the action of) clicking on a virtual object and dragging it to a different location or onto another virtual object. In general, it can be used to invoke many kinds of actions, or create various types of associations between two abstract objects.
| |
| - | Drag and drop functionality is one of the most visible aspects of the graphical user interface.
| |
| - | Drag and drop operation enables you to do complex things intuitively.
| |
| - |
| |
| - | In drag and drop we basically drag some data from a data source to a data target. So we must have:
| |
| - | * Some data
| |
| - | * A data source
| |
| - | * A data target
| |
| - |
| |
| - | In wxPython we have two predefined data targets. <b>wx.TextDropTarget</b> and <b>wx.FileDropTarget</b>.
| |
| - | __TOC__
| |
| - |
| |
| - | === wx.TextDropTarget ===
| |
| - |
| |
| - | [[image: wxPython_faq_dragdrop.png | center]]
| |
| - |
| |
| - | <source lang="python">
| |
| - | #!/usr/bin/python
| |
| - | # dragdrop.py
| |
| - |
| |
| - | import os
| |
| - | import wx
| |
| - |
| |
| - | class MyTextDropTarget(wx.TextDropTarget):
| |
| - | def __init__(self, object):
| |
| - | wx.TextDropTarget.__init__(self)
| |
| - | self.object = object
| |
| - |
| |
| - | def OnDropText(self, x, y, data):
| |
| - | self.object.InsertStringItem(0, data)
| |
| - |
| |
| - |
| |
| - | class DragDrop(wx.Frame):
| |
| - | def __init__(self, parent, id, title):
| |
| - | wx.Frame.__init__(self, parent, id, title, size=(650, 500))
| |
| - |
| |
| - | splitter1 = wx.SplitterWindow(self, -1, style=wx.SP_3D)
| |
| - | splitter2 = wx.SplitterWindow(splitter1, -1, style=wx.SP_3D)
| |
| - | self.dir = wx.GenericDirCtrl(splitter1, -1, dir='/home/', style=wx.DIRCTRL_DIR_ONLY)
| |
| - | self.lc1 = wx.ListCtrl(splitter2, -1, style=wx.LC_LIST)
| |
| - | self.lc2 = wx.ListCtrl(splitter2, -1, style=wx.LC_LIST)
| |
| - |
| |
| - | dt = MyTextDropTarget(self.lc2)
| |
| - | self.lc2.SetDropTarget(dt)
| |
| - | self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.OnDragInit, id=self.lc1.GetId())
| |
| - |
| |
| - | tree = self.dir.GetTreeCtrl()
| |
| - |
| |
| - | splitter2.SplitHorizontally(self.lc1, self.lc2)
| |
| - | splitter1.SplitVertically(self.dir, splitter2)
| |
| - |
| |
| - | self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelect, id=tree.GetId())
| |
| - |
| |
| - | self.OnSelect(0)
| |
| - | self.Centre()
| |
| - | self.Show(True)
| |
| - |
| |
| - | def OnSelect(self, event):
| |
| - | list = os.listdir(self.dir.GetPath())
| |
| - | self.lc1.ClearAll()
| |
| - | self.lc2.ClearAll()
| |
| - | for i in range(len(list)):
| |
| - | if list[i][0] != '.':
| |
| - | self.lc1.InsertStringItem(0, list[i])
| |
| - |
| |
| - | def OnDragInit(self, event):
| |
| - | text = self.lc1.GetItemText(event.GetIndex())
| |
| - | tdo = wx.TextDataObject(text)
| |
| - | tds = wx.DropSource(self.lc1)
| |
| - | tds.SetData(tdo)
| |
| - | tds.DoDragDrop(True)
| |
| - |
| |
| - |
| |
| - | app = wx.App()
| |
| - | DragDrop(None, -1, 'dragdrop.py')
| |
| - | app.MainLoop()
| |
| - | </source>
| |
| - |
| |
| - | === wx.FileDropTarget ===
| |
| - | One of the advantages of the GUI over the console is it's intuitiveness. You can learn a GUI program easier than a console application. You often do not need a manual. On the other hand, some graphical operations are too complex. For example, deleting a file by dragging it and droping it to the trash basket is very intuitive and easy to understand, but actually most people just press the delete key. (shift + delete) It is more effective. In our next example we explore a graphical operation, that is very handy. In most GUI text editors, you can open a file by simply dragging it from the file manager and dropping it on the editor.
| |
| - | <source lang="python">
| |
| - | #!/usr/bin/python
| |
| - | # filedrop.py
| |
| - |
| |
| - | import wx
| |
| - |
| |
| - | class FileDrop(wx.FileDropTarget):
| |
| - | def __init__(self, window):
| |
| - | wx.FileDropTarget.__init__(self)
| |
| - | self.window = window
| |
| - |
| |
| - | def OnDropFiles(self, x, y, filenames):
| |
| - |
| |
| - | for name in filenames:
| |
| - | try:
| |
| - | file = open(name, 'r')
| |
| - | text = file.read()
| |
| - | self.window.WriteText(text)
| |
| - | file.close()
| |
| - | except IOError, error:
| |
| - | dlg = wx.MessageDialog(None, 'Error opening file\n' + str(error))
| |
| - | dlg.ShowModal()
| |
| - | except UnicodeDecodeError, error:
| |
| - | dlg = wx.MessageDialog(None, 'Cannot open non ascii files\n' + str(error))
| |
| - | dlg.ShowModal()
| |
| - |
| |
| - | class DropFile(wx.Frame):
| |
| - | def __init__(self, parent, id, title):
| |
| - | wx.Frame.__init__(self, parent, id, title, size = (450, 400))
| |
| - |
| |
| - | self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
| |
| - | dt = FileDrop(self.text)
| |
| - | self.text.SetDropTarget(dt)
| |
| - | self.Centre()
| |
| - | self.Show(True)
| |
| - |
| |
| - |
| |
| - | app = wx.App()
| |
| - | DropFile(None, -1, 'filedrop.py')
| |
| - | app.MainLoop()
| |
| - | </source>
| |
| - |
| |
| - | [[Категория:wxWidgets]]
| |
| - | [[Категория:Python]]
| |