如何在 tkinter Python 中删除列表框中的多个选定项目?

问题描述 投票:0回答:4

我希望在使用 selectmode=MULTIPLE 时能够删除所有选定的项目。 我尝试删除,但它只删除最后选择的项目。有没有办法删除所有的项目。

谢谢

from tkinter import *

def abc():
    listbox.delete(ACTIVE)

def xyz():
    z=listbox.get(0, END)
    print (z)

master = Tk()
scrollbar = Scrollbar(master,orient=VERTICAL)
listbox = Listbox(master, yscrollcommand=scrollbar.set, selectmode=MULTIPLE)
scrollbar.config(command=listbox.yview)
b = Button(master, text="delete", command=abc)
b.pack(side=RIGHT)
b2 = Button(master, text="save", command=xyz)
b2.pack(side=RIGHT)
scrollbar.pack(side= RIGHT, fill=Y)
listbox.pack(side=LEFT)

for item in ["one", "two", "three", "four", "five"]:
    listbox.insert(END, item)

mainloop()
python tkinter listbox
4个回答
11
投票

要获取所有选定的项目而不是仅最后一项,可以使用

listbox.curselection()
,然后从最后一项开始逐项删除,这样删除时不会修改其他项目的索引。

def abc():
    sel = listbox.curselection()
    for index in sel[::-1]:
        listbox.delete(index)

顺便说一句,我建议您为函数指定有意义的名称(例如“delete”而不是“abc”)。


4
投票

仅删除一半选定的项目。

我认为每次删除后都会重新创建索引,因此重新分配给已删除索引的项目不会被删除。

项目索引:删除0后0,1,2,3变成0,1,2那么它认为0已经被删除所以删除1。删除1后索引是0,1 - 两者都已经被删除所以仅此而已删除。

答案:技巧是以相反的顺序删除所选项目,以便列表中较早的项目不会因删除而重新索引:

def call_delete():
    selection = listBox.curselection()
    for i in reversed(selection):
        listBox.delete(i)

0
投票

您可以使用 python 内置的尊重方法删除 lsbox 的选定项目:

def delete_task():
    selections = lsbox.curselection()
    for selection in reversed(selections):
        lsbox.delete(selection)

-2
投票

编辑 更好的答案不是这个,而是将其留在这里作为文档和网址。查看https://stackoverflow.com/a/44818820/1141389

查看此处,了解有关列表框 wiget 的更多信息

您可以使用

清除整个列表框
listbox.delete(0, END)

如果您只想删除所选项目,我认为您可以执行以下操作:

def abc():
    items = map(int, listbox.curselection())
    for item in items:
        listbox.delete(item)

但请注意,我目前无法对此进行测试。尝试上述方法并查看网站,这应该会让您走上正轨。

© www.soinside.com 2019 - 2024. All rights reserved.