WxPython FAQ Drag and Drop

Материал из Wiki.crossplatform.ru

(Различия между версиями)
Перейти к: навигация, поиск
(Новая: 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 ...)
(Удалено по требованию автора...)
 
(1 промежуточная версия не показана)
Строка 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>.
 
-
* <a href="#text">wx.TextDropTarget</a>
 
-
* <a href="#file">wx.FileDropTarget</a>
 
-
 
-
=== 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]]
 

Текущая версия на 12:00, 7 апреля 2009