モデルとして 4 つの列を持つ Gtk.ListStore を持つ単純な Gtk.TreeView があります。TreeView 内で行をドラッグ アンド ドロップし、発生した行の挿入、変更、および削除を追跡して、元に戻す/やり直し操作をドラッグ アンド ドロップ操作に実装できるようにしたいと考えています。私は PyGObject 3 と Python 3.2 を使用しています。
Gtk.TreeDragSource および Gtk.TreeDragDest インターフェースでメソッドを使用すると、drag_data_get ハンドラーで Gtk.TreeDragSource.drag_data_get() を使用し、drag_data_received で Gtk.TreeDragDest.drag_data_received() または Gtk.tree_get_row_drag_data() を使用して、私のニーズに完全に適合すると考えました。ハンドラ。基本的に、私が試したことは次のようになります。
def drag_data_get(self, tv, context, selection, target_id, time):
treeselection = tv.get_selection()
model, my_iter = treeselection.get_selected()
path = model.get_path(my_iter)
result = Gtk.TreeDragSource.drag_data_get(path, selection)
def drag_data_received(self, tv, context, x, y, selection, info, time):
result, model, row = Gtk.tree_get_row_drag_data(selection)
my_iter = model.get_iter(row)
data = [model.get_value(my_iter, i) for i in range(model.get_n_columns())]
drop_info = tv.get_dest_row_at_pos(x, y)
if drop_info:
path, position = drop_info
my_iter = model.get_iter(path)
if (position == Gtk.TreeViewDropPosition.BEFORE
or position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE):
model.insert_before(my_iter, [data])
else:
model.insert_after(my_iter, [data])
else:
model.append([data])
if context.get_actions() == Gdk.DragAction.MOVE|Gdk.DragAction.DEFAULT:
context.finish(True, True, time)
return
これは見事に失敗します。Python が Gtk.TreeDragSource.drag_data_get() の呼び出しにヒットすると、Python がクラッシュし、プログラム ウィンドウがすばやく消えます。drag_data_received ハンドラーにさえ到達しません。TreeDragSource および TreeDragDest インターフェイスを使用するこれらのメソッドがどのように機能するかを示すコード例を教えてください。どんな助けでも大歓迎です!