1

私の現在のプロジェクトでは、を使用して、行ごとに4つのフィールド、2つの文字列、anとaGtk.TreeViewのコンテンツを表示しています。TreeViewで行のドラッグアンドドロップ再配置を実装しようとしています。モデルからのデータの挿入と削除をある程度制御し、ドラッグアンドドロップ操作の元に戻す/やり直しを実装できるようにしたいので、組み込みのドラッグアンドドロップに単純に使用したくありません。Python3.2とPyGObject3を使用しています。ListViewintbooleanTreeView.set_reorderable(True)

私が今抱えている問題は、ドラッグアンドドロップする行を構成するdrag_data_get2つの文字列(intと1つ)を使用して選択データオブジェクトを設定する方法をメソッドで理解することです。bool私が見つけたすべてのサンプルコードには、次のようなもので選択に設定される文字列値を持つ単一の列を持つツリービューが含まれています。

def drag_data_get_data(self, treeview, context, selection, target_id, etime):
    treeselection = treeview.get_selection()
    model, iter = treeselection.get_selected()
    data = bytes(model.get_value(iter, 0), "utf-8")
    selection.set(selection.get_target(), 8, data)

TreeView行の1つからのデータを使用して選択オブジェクトを設定するためのすべての努力が失敗しました。モデルのintandbool値は文字列値のようにエンコードできず、複数列のTreeView行のすべての値を単一の選択オブジェクトに設定する方法の例を見つけることができません。誰かが私にいくつかの関連する例やドキュメントを教えてもらえますか?

4

1 に答える 1

1

4つの値のタプルを1つの文字列にエンコードできます。簡単な方法は、そのために使用jsonすることです。

import json
data = ["string", "string2", True, 20]
string_variable = json.dumps(data)
#
# now pass string_variable through drag and drop
#
returned = json.loads(string_variable)

インポートjsonがオプションでない場合は、独自のエンコードスキームを使用することもできます。

この方法で取得したデータの健全性チェックを慎重に行ってください。そうしないと、特別に細工された文字列(たとえば、別のプログラムから渡されたもの)によって、プログラムがクラッシュしたり、さらに悪化したりする可能性があります。

于 2012-10-23T15:55:16.923 に答える