2012-10-22 64 views
1

我目前的項目使用Gtk.TreeView每行四個字段,兩個字符串,一個intboolean顯示ListView的內容。我試圖在TreeView中實現對行的拖放重排。我不想簡單地將TreeView.set_reorderable(True)用於內置拖放操作,因爲我想控制從模型中插入和刪除數據,以及能夠實現拖放操作的撤銷/重做。我正在使用Python 3.2和PyGObject 3.如何設置多個項目成樹狀視圖拖動GtkSelection拖放

現在我正在解決的問題是如何在我的drag_data_get方法設置選擇數據對象與兩個字符串,一個int和一個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行失敗了。我的模型中的intbool值不能像字符串值那樣進行編碼,並且我找不到任何有關如何將多列TreeView行的所有值設置爲單個選擇對象的示例。任何人都可以向我指出一些相關的例子或文檔嗎?

回答

1

您可以將4個值的元組編碼爲單個字符串。一個簡單的方法是使用該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是不適合你的選擇。

請仔細檢查您以這種方式得到的數據。如果你不這樣做,一些特製的字符串(從另一個程序中傳遞)可能會導致程序崩潰或更糟糕。

+0

謝謝! Json做了我所需要的。拖放功能完全按照預期工作。感謝關於完整性檢查的警告 - 我將限制拖放到拖放源和拖動目標的相關TargetEntry中的相同小部件。這應該可以防止幾乎所有的惡意案件,不是嗎? – knutsondc

+0

是的,我認爲這應該足夠安全。您應該將我的答案標記爲已接受,這就是堆棧溢出的方式。 :-) –