Listview 如何上下移动多个ListStore元素

Listview 如何上下移动多个ListStore元素,listview,python-3.x,gtk3,Listview,Python 3.x,Gtk3,我有一个Gtk.ListStore模型,里面充满了标题和作者信息,我希望用户能够移动元素,将它们按他们选择的任何顺序排列。这意味着提供“上移”和“下移”按钮 不幸的是,我在中找到的逻辑与允许选择多个元素的Gtk.TreeView不配合 Gtk.TreeSelection.get_selected()返回一个元组,其中包含一个Gtk.TreeIter,该元组指向当前选定的单个行,但Gtk.TreeSelection.get_selected_rows()返回一个元组,该元组包含Gtk.TreePa

我有一个
Gtk.ListStore
模型,里面充满了标题和作者信息,我希望用户能够移动元素,将它们按他们选择的任何顺序排列。这意味着提供“上移”和“下移”按钮

不幸的是,我在中找到的逻辑与允许选择多个元素的
Gtk.TreeView
不配合

Gtk.TreeSelection.get_selected()
返回一个元组,其中包含一个
Gtk.TreeIter
,该元组指向当前选定的单个行,但
Gtk.TreeSelection.get_selected_rows()
返回一个元组,该元组包含
Gtk.TreePath
元素的列表

上面链接的单个选定行问题的答案仅适用于
Gtk.TreeIter
对象,我还没有弄清楚如何将
Gtk.treeiPath
转换为
Gtk.TreeIter
对象

然而,我确实找到了
Gtk.ListStore.move_在(iter,position)
上方和
Gtk.ListStore.move_在(iter,position)
下方的方法,但它们同样需要
Gtk.TreeIter
对象才能工作


我是否遗漏了一些其他人完全清楚的东西?

Gtk.ListStore.move_下方(iter,position)
是正确的调用方法,事实证明,与我使用的Python 3版本和Gtk3接口相比,我阅读的文档实际上是错误的。
(抱歉,我不知道如何确定我使用的是哪个版本的界面)

Gtk.TreeSelection.get_selected_rows()
实际上返回一个元组,其中包含
Gtk.TreeModelRow
和我使用的模型的表示形式

Gtk.TreeModelRow
包含对给定行的相应
Gtk.TreePath
Gtk.TreeIter
对象的引用,这些对象由变量
Gtk.TreeModelRow.path
Gtk.TreeModelRow.iter
引用

因此,我向上移动多个选定行的最后一个代码是:

selection = treeView.get_selection()
selections, model = selection.get_selected_rows()

for row in selections:
    # Make sure the row we are given is actually selected
    if selection.iter_is_selected(row.iter) and row.previous != None:
        self.listData.move_before(row.iter, row.previous.iter)
以及向下移动多个选定行的代码:

selection = treeView.get_selection()
selections, model = selection.get_selected_rows()

# Note: Must loop through rows in the opposite direction so as not to move a row all the way to the bottom
for i in range(len(selections)-1, -1, -1):
    row = selections[i]
    # Make sure the row we are given is actually selected
    if selection.iter_is_selected(row.iter) and row.next != None:
        self.listData.move_after(row.iter, row.next.iter)

这个问题的公认答案使用了
行.previous
,我的版本中似乎没有。这是我的解决方案,用于向上移动行。它似乎工作正常,但我对建议和批评持开放态度,因为我是Python和PyGtk新手,目前正在使用Python 2.7和PyGtk2

@staticmethod
    def _move_item_up(list_store, list_widget):
        selection = list_widget.get_selection()
        selections, model = selection.get_selected_rows()
        for row in selections:
            previous_path = (row.path[0]-1,)
            if selection.iter_is_selected(row.iter) and previous_path[0] > -1:
                list_store.move_before(row.iter, list_store.get_iter(previous_path))

接受的答案使用并非所有库中都存在的未记录成员。当您尝试向上移动已经位于顶部的行时,另一个有一个错误:它会将顶部的行循环到选择的底部,将所有其他选定行向上移动一行

这里有一个上下都适用的解决方案

def向上移动所选项目(树状视图):
selection=treeView.get_selection()
模型,所选路径=选择。获取所选行()
对于所选路径中的路径:
上面的索引_=路径[0]-1
如果指数_高于<0:
返回
model.move_-before(model.get_iter(路径),model.get_iter((上面的索引,))
def向下移动所选项目(树状视图):
selection=treeView.get_selection()
模型,所选路径=选择。获取所选行()
对于反向路径(选定的路径):
下面的索引_=路径[0]+1
如果以下索引_>=len(型号):
返回
model.move\u after(model.get\u iter(路径),model.get\u iter((下面的索引,))

以@codedog的答案作为起点。最初修改只是为了修复bug,但后来通过更好地使用从
get_selected_rows()

返回的值进行了简化,我对Python和PyGtk是新手。。。出于某种原因,我的TreeModelRow对象
没有
上一个
属性。这只在以后的版本中可用吗?我必须有一个更新的版本。我的文档实际上没有列出
TreeModelRow
对象的
previous
。。。