【问题标题】:How to use wxpython's DataViewCtrl Drag and Drop如何使用 wxpython 的 DataViewCtrl 拖放
【发布时间】:2015-02-24 13:44:08
【问题描述】:

我想将拖放与wx.dataview.DataViewCtrl 结合使用,因此我开始尝试使用拖放对行重新排序。我无法在 wxpython 中找到如何正确执行此操作的任何示例,但无论如何,我设法让它部分工作(见下文)。

不幸的是,event.GetDataObject() 在我的on_drop 函数中总是返回None。任何指针如何获取我在on_begin_drag 中分配的数据对象?我做错了什么?

提前致谢!

设置:

  • ArchLinux(64 位)
  • python2 2.7.9-1
  • wxpython 3.0.2.0-1
  • gtk3 3.14.8-1
  • gnome-shell 3.14.3-2

示例代码:

import wx
import wx.dataview

DF_PLAYLIST_SONG = wx.CustomDataFormat("playlist_song")

class MyDataViewCtrl(wx.dataview.DataViewCtrl)
  def __init__(self, *args. **kwargs)
    [...]
    self.Bind(wx.dataview.EVT_DATAVIEW_ITEM_BEGIN_DRAG, self.on_begin_drag)
    self.Bind(wx.dataview.EVT_DATAVIEW_ITEM_DROP, self.on_drop)

    self.EnableDragSource(DF_PLAYLIST_SONG)
    self.EnableDropTarget(DF_PLAYLIST_SONG)

  [...]

  def on_begin_drag(self, event):
    text = self._model.GetValue(event.GetItem(), 0)
    data = wx.CustomDataObject(DF_PLAYLIST_SONG)
    # Need to encode, because SetData dislikes unicode
    data.SetData(text.encode('utf-8'))
    event.SetDataObject(data)
    #data.this.disown() # Makes no difference if uncommented or not

  def on_drop(self, event):
    print(event.GetDataFormat()) # Returns DF_PLAYLIST_SONG
    if event.GetDataFormat() == DF_PLAYLIST_SONG:
      # This would be logical choice:
      print(event.GetDataSize()) # Returns the size of the data, e.g 92
      print(event.GetDataObject()) # Returns None (strange!)
      # Some other stuff I tried
      print(event.GetClientObject()) # Returns MyDataViewCtrl instance
      print(event.GetEventObject()) # Returns None
      print(event.GetValue()) # Returns <Swig Object of type 'wxVariant *' at 0x7fffa340a0d0>
      print(self._model.GetValue(event.GetItem(), 0)) # Returns column 0 of the row this was dropped on
      print(event.GetItem()) # Returns the wx.dataview.DataViewItem this was dropped on
      print(event.GetDataBuffer()) # Returns <Swig Object of type 'void *' at 0x1a59b30>

【问题讨论】:

    标签: python python-2.7 drag-and-drop wxpython wxwidgets


    【解决方案1】:

    wxEVT_DATAVIEW_ITEM_DROPhander 中的数据对象不会取回,它仅用于将数据拖离控件。删除时,您将获得原始数据及其格式,即您应该使用GetDataSize()GetDataBuffer() 访问它。

    【讨论】:

    • 谢谢,你能给我一个提示吗(即从缓冲区获取数据)?
    • 对不起,我也不知道如何在 Python 中做到这一点。让我们希望罗宾可以联系your ticket
    【解决方案2】:

    this example on a wxWidgets/wxPython ticket 15100。我用它对wx.DataViewCtrl 进行拖放操作,并发生树状数据结构(以取回对象)。至少在 2.9.5/msw 上工作。 HitTest 已在 3.0.2 中实现(如果您想知道哪个项目被击中)。

    可能不是您问题的正确答案,但至少它确实有效(请参阅对象项的疯狂酸洗)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多