Python 通过重新写入保留选定的列表框项目

Python 通过重新写入保留选定的列表框项目,python,tkinter,listbox,Python,Tkinter,Listbox,我有一个函数,可以通过删除列表框条目并用更新的计数器重新插入它们来更新列表框条目,但是当我试图维护高亮显示的条目时,会出现困难,因为它已被删除,所以没有什么要高亮显示的 我的问题是如何让程序记住突出显示的内容 代码: 编辑创建的压缩工作版本的代码您所要做的就是获取突出显示项的索引,替换数据,然后重新选择突出显示项。如果每个项目都是唯一的,那么流程就非常简单 如果项目不是唯一的,它仍然是可能的。您只需保存每个选定项的索引。删除某些内容时,请记住已删除项目的索引。恢复选择时,已删除项目上方的项目索引

我有一个函数,可以通过删除列表框条目并用更新的计数器重新插入它们来更新列表框条目,但是当我试图维护高亮显示的条目时,会出现困难,因为它已被删除,所以没有什么要高亮显示的

我的问题是如何让程序记住突出显示的内容

代码:


编辑创建的压缩工作版本的代码您所要做的就是获取突出显示项的索引,替换数据,然后重新选择突出显示项。如果每个项目都是唯一的,那么流程就非常简单

如果项目不是唯一的,它仍然是可能的。您只需保存每个选定项的索引。删除某些内容时,请记住已删除项目的索引。恢复选择时,已删除项目上方的项目索引将保持不变,已删除项目下方的项目索引需要减去一(即:如果删除项目#5且选择了#10,则删除后需要重新选择#9)

以下是当您知道列表框中的项目是唯一的时的解决方案

首先,这将按值保存选定的所有内容:

def saveSelection(lb):
    selection = []
    for i in lb.curselection():
        selection.append(lb.get(i))
    return selection
稍后,您可以使用以下命令还原所选项目:

def restoreSelection(lb, selectedItems):
    lb.selection_clear(0, "end")
    items = lb.get(0, "end")
    for item in selectedItems:
        if item in items:
            index = items.index(item)
            lb.selection_set(index)

请创建一个工作示例,这意味着我们可以直接复制和运行一个示例,并将您的情况可视化。@Xenomorph我已经用工作示例编辑了问题OK,即使它非常复杂。。。而且,当你使用线程时,每个程序都会变得复杂。。。我不确定我是否能帮上忙,但我希望有人能看到情况,帮助你;)您不需要所有这些代码来复制问题。请阅读Hi,我认为这是正确的答案,但我正在努力将其纳入我的程序,我应该在哪里/如何调用函数。任何建议都将非常感谢-Jim@Jim:更改列表框前立即调用
saveSelection
,更改列表框后立即调用
restoreSelection
。很抱歉一直打扰您,我已尝试添加此列表框,但终身无法使用,我认为这是因为当我删除并重新插入该行时,它会将计数器增加1,因此
如果items
中的项不是
True
,我将如何仅基于该行的前6个字符进行此操作,因为它们是标识符,不受限制change@jim:您可以执行任何类型的条件测试。您只需要某种方法来唯一地标识每一行,以便知道应该重新突出显示哪一行。
def saveSelection(lb):
    selection = []
    for i in lb.curselection():
        selection.append(lb.get(i))
    return selection
def restoreSelection(lb, selectedItems):
    lb.selection_clear(0, "end")
    items = lb.get(0, "end")
    for item in selectedItems:
        if item in items:
            index = items.index(item)
            lb.selection_set(index)