# tree widget drag'n'drop demo # # 15-OCT-01 created import os import Tree from Tkinter import * class Tester: def __init__(self, root, name): # create window self.top=Toplevel(root) self.top.title(name) self.top.columnconfigure(0, weight=1) self.top.rowconfigure(0, weight=1) # create the control self.tree=Tree.Tree(master=self.top, root_id=os.sep, root_label=os.sep, get_contents_callback=getfiles, drop_callback=dnd_update, height=400, width=300) self.tree.grid(column=0, row=0, sticky='nsew') self.tree.name=name # add scrollbars sb=Scrollbar(self.top) sb.grid(column=1, row=0, sticky='ns') self.tree.configure(yscrollcommand=sb.set) sb.configure(command=self.tree.yview) sb=Scrollbar(self.top, orient=HORIZONTAL) sb.grid(column=0, row=1, sticky='ew') self.tree.configure(xscrollcommand=sb.set) sb.configure(command=self.tree.xview) # expand root self.tree.root.expand() def getfiles(node): print 'getfiles' op=os.path path=apply(op.join, node.full_id()) for filename in os.listdir(path): full=op.join(path, filename) name=filename folder=0 if op.isdir(full): # it's a directory folder=1 elif not op.isfile(full): # but it's not a file name=name+' (special)' if op.islink(full): # it's a link name=name+' (link to '+os.readlink(full)+')' node.widget.add_node(name=name, id=filename, flag=folder) print 'getfiles done' # update on drag'n'drop def dnd_update(source, target): print "Drag'n'drop event!" print 'Source:', source.full_id(), 'of', source.widget.name print 'Target:', target.full_id(), 'of', target.widget.name print if target == target.widget.root: # can't step on the root node target.insert_children( target.widget.add_list(name=source.get_label(), id=source.id, flag=source.expandable_flag, expanded_icon=source.expanded_icon, collapsed_icon=source.collapsed_icon)) else: target.insert_before( target.widget.add_list(name=source.get_label(), id=source.id, flag=source.expandable_flag, expanded_icon=source.expanded_icon, collapsed_icon=source.collapsed_icon)) source.delete() root=Tk() root.title("Drag'n'drop") root.geometry("+1+1") Button(command=root.quit, text="Quit").pack() t1=Tester(root, 'TESTER1') t1.top.geometry("+1+60") t2=Tester(root, 'TESTER2') t2.top.geometry("+350+60") root.mainloop()