source: Drag&Drop
import pygtk
pygtk.require("2.0")
import gtk
import pickle
NAME="Drag&Drop"
list1_data = ["list1_a", "list1_b", ]
list2_data = ["list2_a", "list2_b", ]
def create_glist(list):
glist = gtk.ListStore(str)
for data in list:
iter = glist.append( (data,) )
glist.set(iter)
return glist
def create_treeview(glist):
treeview = gtk.TreeView()
model = treeview.get_selection()
model.set_mode(gtk.SELECTION_SINGLE)
r = gtk.CellRendererText()
treeview.insert_column_with_attributes(-1, "Name", r, text=0)
treeview.set_model(glist)
treeview.show()
return treeview
def serialize(data):
return pickle.dumps(data)
def unserialize(data):
return pickle.loads(data)
def l(list):
iter = list.get_iter_root()
while iter is not None:
n = list.get_n_columns()
tmp = []
for i in range(0, n):
tmp.append( list.get_value(iter, i) )
print tmp
iter = list.iter_next(iter)
class t_drag_drop(gtk.Window):
TARGETS = [
("INT", 0, 1),
("TEXT", 0, 2),
]
def __init__(self):
gtk.Window.__init__(self)
self.set_title("Drag Drop")
self.set_geometry_hints(min_width=200)
self.connect("destroy", gtk.main_quit)
self.list1 = create_glist(list1_data)
self.tree1 = create_treeview(self.list1)
self.tree1.enable_model_drag_source(
gtk.gdk.BUTTON1_MASK,
self.TARGETS,
gtk.gdk.ACTION_COPY
)
self.tree1.connect("drag_data_get", self.drag_data_get_data)
self.list2 = create_glist(list2_data)
self.tree2 = create_treeview(self.list2)
self.tree2.enable_model_drag_dest(
self.TARGETS,
gtk.gdk.ACTION_DEFAULT)
self.tree2.connect("drag_data_received", self.drag_data_received_data)
self.h = gtk.HBox(2)
self.h.pack_start(self.tree1)
self.h.pack_end(self.tree2)
self.h.show()
self.add(self.h)
def drag_data_get_data(self, treeview, context, selection, target_id,
etime):
treeselection = treeview.get_selection()
model, iter = treeselection.get_selected()
path = model.get_path(iter)
print len(serialize(path))
selection.set(selection.target, 8, serialize(path))
def drag_data_received_data(self, treeview, context, x, y, selection,
info, etime):
model = treeview.get_model()
path_src = unserialize(selection.data)
print "data:", path_src, len(selection.data)
drop_info = treeview.get_dest_row_at_pos(x, y)
if drop_info:
path, position = drop_info
print "drop_info:", drop_info
iter = model.get_iter(path)
print "position:", position
tmp = []
model_src = self.tree1.get_model()
iter_src = model_src.get_iter(path_src)
for i in range(0, model_src.get_n_columns()):
tmp.append(model_src.get_value(iter_src, i))
model.append( tmp )
model_src.remove(iter_src)
l(self.list2)
t = t_drag_drop()
t.show()
gtk.main()