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

Posted

技术标签:

【中文标题】更改 tkinter 列表框中的项目顺序【英文标题】:changing order of items in tkinter listbox 【发布时间】:2012-10-16 23:20:40 【问题描述】:

有没有比删除特定键的值,然后重新输入新信息更简单的方法来?

例如,我希望能够重新排列列表框中的项目。如果我想交换两个位置,这就是我所做的。它有效,但我只是想看看是否有更快的方法来做到这一点。

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)

【问题讨论】:

【参考方案1】:

有没有比删除特定键的值,然后重新输入新信息更简单的方法来更改 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】:

为了扩展蒂姆的答案,如果您使用 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 添加到索引而不是减去。您还需要反转循环的列表,以便不断变化的索引不会弄乱集合中的未来移动。

【讨论】:

以上是关于更改 tkinter 列表框中的项目顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何更改列表框中的所有项目

WPF:停止或反转列表框中的选择更改

如何在运行时更改列表框中的选定项目文本?

如何在 Tkinter 列表框中插入时添加自动滚动?

Csharp:根据组合框中的值加载选中的项目列表

如何重命名列表框中的项目? [关闭]