【问题标题】:How to remove multiple selected items in listbox in tkinter Python?如何在 tkinter Python 中删除列表框中的多个选定项目?
【发布时间】:2017-12-02 18:22:37
【问题描述】:

当我使用 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


    【解决方案1】:

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

    看看here for more info on Listbox wiget

    你可以清除整个列表框

    listbox.delete(0, END)
    

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

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

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

    【讨论】:

    • 我已经测试了你的答案,如果你选择“一”、“三”、“五”项并单击“删除”,它不会删除正确的项。
    • 你用我的方法替换了你的整个abc 方法吗?你不应该在项目中有“一个”等
    • 是的,我用你的替换了 OP 代码中的 abc 方法,然后我点击了“一”、“三”、“五”来选择它们(这就是我在之前评论中的意思). 然后我点击“删除”,它删除了项目“一”和“四”。
    • 啊。就像我说的,我目前无法测试。我以后也许可以,但希望该链接能满足您的需求。
    • 问题来自这样一个事实,即通过删除第一项,您更改了其他项的索引。为避免这种情况,您可以从末尾开始迭代项目(就像我在回答中所做的那样)。
    【解决方案2】:

    要获取所有选中的项目而不是最后一个,可以使用listbox.curselection(),然后从最后一个开始逐个删除,这样其他的索引不会被删除修改。

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

    顺便说一句,我建议你给你的函数起一个有意义的名字(比如“delete”而不是“abc”)。

    【讨论】:

      【解决方案3】:

      只有一半的选定项目被删除。

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

      item index: 0,1,2,3 删除后 0 变为 0,1,2 然后它认为 0 已被删除所以删除 1。删除 1 后索引为 0,1 - 这两个都已删除所以没有什么可删除的了。

      回答:诀窍是以相反的顺序删除选定的项目,以便列表中较早的项目不会被删除重新索引:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-06
        • 1970-01-01
        • 2011-10-27
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-18
        相关资源
        最近更新 更多