Fehlerhaftes DragAndDrop in wx.TreeListCtrl
Verfasst: Dienstag 10. April 2007, 19:52
Ich habe in einem Script für ein TreeListCtrl DragAndDrop implementiert. Unter Python 2.4.2 mit wxPython 2.6 funktionierte das wunderbar. Nach Update auf Python 2.4.4 und wxPython 2.8 nicht mehr. Bei EVT_TREE_BEGIN_DRAG wird scheinbar das Item übergeben, auf das der Cursor bewegt wird, und nicht das, von dem das Dragging startet. Auch wandert die Selection (die blau hinterlegte Zeile nicht mit). Googlen förderte schon ähnliche Probleme zu Tage, z.B.: http://archives.devshed.com/forums/pyth ... 23112.html. Kennt jemand das Problem und am besten auch die Lösung? Ansonsten: Wo kann man den mutmaßlichen Bug mitteilen? Die im o.g. Link vorgeschlagene Lösung, das selektierte Item zu verwenden, funktioniert nur z.T., weil ich gern das Start-Item markieren und die sich ändernde Selektion verfolgen möchte. Dies geht trotzdem nicht.
Hier ein bisschen Beispielcode zum Testen:Danke
HWK
Hier ein bisschen Beispielcode zum Testen:
Code: Alles auswählen
import wx
import wx.gizmos as gizmos
class TestPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
self.DragItem = None
self.Bind(wx.EVT_SIZE, self.OnSize)
self.tree = gizmos.TreeListCtrl(self, -1, style = wx.TR_DEFAULT_STYLE
| wx.TR_FULL_ROW_HIGHLIGHT)
isz = (16,16)
il = wx.ImageList(isz[0], isz[1])
fldridx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, isz))
fldropenidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, isz))
self.fileidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))
self.tree.SetImageList(il)
self.il = il
self.tree.AddColumn("Main column")
self.tree.SetMainColumn(0)
self.tree.SetColumnWidth(0, 175)
self.root = self.tree.AddRoot("The Root Item")
self.tree.SetItemImage(self.root, fldridx, which = wx.TreeItemIcon_Normal)
self.tree.SetItemImage(self.root, fldropenidx, which = wx.TreeItemIcon_Expanded)
for x in range(15):
txt = "Item %d" % x
child = self.tree.AppendItem(self.root, txt)
self.tree.SetItemImage(child, fldridx, which = wx.TreeItemIcon_Normal)
self.tree.SetItemImage(child, fldropenidx, which = wx.TreeItemIcon_Expanded)
for y in range(5):
txt = "item %d-%s" % (x, chr(ord("a")+y))
item = self.tree.AppendItem(child, txt)
self.tree.SetItemImage(item, self.fileidx, which = wx.TreeItemIcon_Normal)
self.tree.SetItemImage(item, self.fileidx, which = wx.TreeItemIcon_Selected)
self.tree.Expand(self.root)
self.tree.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnBeginDrag)
self.tree.Bind(wx.EVT_TREE_END_DRAG, self.OnEndDrag)
def OnBeginDrag(self, evt):
if not self.tree.ItemHasChildren(evt.GetItem()):
evt.Allow()
self.DragItem = evt.GetItem()
print self.tree.GetItemText(self.DragItem)
def OnEndDrag(self, evt):
old = self.DragItem
if old is None:
return
new_ = evt.GetItem()
if not new_.IsOk() or new_ == old:
return
parent = self.tree.GetItemParent(new_)
OldParent = self.tree.GetItemParent(old)
if new_ != OldParent and parent != OldParent:
self.tree.UnselectAll()
self.tree.SelectItem(old)
return
text = self.tree.GetItemText(old, 0)
self.tree.Delete(old)
if new_ == OldParent:
child = self.tree.InsertItemBefore(new_, 0, text)
else:
child = self.tree.InsertItem(parent, new_, text)
self.tree.SetItemImage(child, self.fileidx,
which = wx.TreeItemIcon_Normal)
self.tree.SetItemImage(child, self.fileidx,
which = wx.TreeItemIcon_Expanded)
self.tree.SelectItem(child)
self.DragItem = None
def OnSize(self, evt):
self.tree.SetSize(self.GetSize())
def main():
app = wx.PySimpleApp()
frame = wx.Frame(None, -1, 'TreeListCtrl', size=(200, 400))
panel = TestPanel(frame)
frame.Show()
app.MainLoop()
if __name__ == '__main__':
main()
HWK