2015-02-24 71 views
0

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

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

在此先感谢!

设置:

  • 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> 

回答

1

你不取回数据对象wxEVT_DATAVIEW_ITEM_DROP投手,这只是用于从控件拖动数据了。丢弃时,您将获得原始数据及其格式,即您应该使用GetDataSize()GetDataBuffer()来访问它。

+0

谢谢,你能给我一个提示如何做到这一点(即从缓冲区获取数据)? – 2015-02-24 16:17:51

+0

对不起,我不知道如何在Python中做到这一点。让我们希望罗宾可以解决[你的机票](http://trac.wxwidgets.org/ticket/16881)。 – 2015-02-25 14:16:25

0

请参阅this example on a wxWidgets/wxPython ticket 15100。我用它来做一个wx.DataViewCtrl的拖放操作,并且发生一个树状数据结构(以获取一个对象)。至少在2.9.5/msw工作。已经在3.0.2中实现了HitTest(如果你想知道哪个项目被击中)。

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