返回介绍

Drag and drop in wxPython

发布于 2025-02-22 22:19:36 字数 4542 浏览 0 评论 0 收藏 0

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. wx.TextDropTarget and wx.FileDropTarget .

  • wx.TextDropTarget
  • wx.FileDropTarget

wx.TextDropTarget

Text drag and drop
Figure: Text drag and drop
#!/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()

wx.FileDropTarget

One of the advantages of the GUI over the console is its 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 dropping it to the trash basket is very intuitive and easy to understand, but many people just press the Delete key. It is more effective. In our next example we explore a graphical operation, that is very handy. In most GUI text editors, we can open a file by simply dragging it from the file manager and dropping it on the editor.

#!/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()

This chapter described shortly drag and drop operations in wxPython.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文