Форум сайта python.su
1
Нужно в Treeview реализовать перетаскивание мышкой любой строки в другую позицию. Нашел пример для pygtk. Но в свою программу перенести не смог. Использую Python, GTK3, glade.
Офлайн
1
Получилось. :) На основе примеров этого и этого написал простейший пример.
#!/usr/bin/python from gi.repository import Gtk, Gdk class MyWindow(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title="Drag and Drop Demo") self.set_size_request(200, 200) store = Gtk.ListStore(str) self.treeview = Gtk.TreeView(store) renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn("Title", renderer, text=0) self.treeview.append_column(column) self.add(self.treeview) store.append(['Item 1']) store.append(['Item 2']) store.append(['Item 3']) store.append(['Item 4']) store.append(['Item 5']) self.treeview.enable_model_drag_source( Gdk.ModifierType.BUTTON1_MASK, [('text', Gtk.TargetFlags.SAME_WIDGET, 0)], Gdk.DragAction.MOVE) self.treeview.enable_model_drag_dest([('text', Gtk.TargetFlags.SAME_WIDGET, 0)], Gdk.DragAction.MOVE) self.treeview.drag_source_add_text_targets() self.treeview.drag_dest_add_text_targets() self.treeview.connect("drag_data_get", self.drag_data_get_data) self.treeview.connect("drag_data_received", self.drag_data_received_data) def drag_data_get_data(self, treeview, context, selection, target_id, etime): treeselection = treeview.get_selection() model, iter = treeselection.get_selected() data = model.get_value(iter, 0) selection.set(selection.get_selection(), 8, data) def drag_data_received_data(self, treeview, context, x, y, selection, info, etime): model = treeview.get_model() data = selection.get_data() drop_info = treeview.get_dest_row_at_pos(x, y) if drop_info: path, position = drop_info iter = model.get_iter(path) if (position == Gtk.TreeViewDropPosition.BEFORE or position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE): model.insert_before(iter, [data]) else: model.insert_after(iter, [data]) else: model.append([data]) if context.get_actions() == Gdk.DragAction.MOVE: context.finish(True, True, etime) return win = MyWindow() win.connect("delete-event", Gtk.main_quit) win.show_all() Gtk.main()
Отредактировано b_oss (Апрель 16, 2014 08:57:06)
Офлайн