更改tkinter列表框中项目的顺序

4

有没有一种更简单的方法来改变tkinter列表框中项目的顺序,而不是删除特定键的值,然后重新输入新信息?

例如,我想能够重新排列列表框中的项目。如果我想交换两个项目的位置,我已经做过了。它可以工作,但我想知道是否有更快的方法。

def moveup(self,selection):
    value1 = int(selection[0]) - 1 #value to be moved down one position
    value2 = selection #value to be moved up one position
    nameAbove = self.fileListSorted.get(value1) #name to be moved down
    nameBelow = self.fileListSorted.get(value2) #name to be moved up

    self.fileListSorted.delete(value1,value1)
    self.fileListSorted.insert(value1,nameBelow)
    self.fileListSorted.delete(value2,value2)
    self.fileListSorted.insert(value2,nameAbove)
2个回答

7

有没有更简单的方法来改变tkinter列表框中项目的顺序,而不是删除特定键的值,然后重新输入新信息?

没有。删除和重新插入是唯一的方法。但如果你只想将单个项目向上移动一个位置,你可以只进行一次删除和插入。

def move_up(self, pos):
    """ Moves the item at position pos up by one """

    if pos == 0:
        return

    text = self.fileListSorted.get(pos)
    self.fileListSorted.delete(pos)
    self.fileListSorted.insert(pos-1, text)

2
为了补充Tim的回答,如果使用tkinter.listboxcurrentselection()函数,也可以对多个项目进行此操作。
l = self.lstListBox
posList = l.curselection()

# exit if the list is empty
if not posList:
    return

for pos in posList:

    # skip if item is at the top
    if pos == 0:
        continue

    text = l.get(pos)
    l.delete(pos)
    l.insert(pos-1, text)

这将把所有选定的项目向上移动1个位置。它也可以轻松地适应向下移动项目。您需要检查该项是否位于列表末尾而不是顶部,然后将索引加1而不是减去。您还需要反转列表以进行循环,以便更改索引不会破坏集合中未来的移动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接