Python Tkinter多选Listbox

时间:2013-01-16 15:38:35

标签: python tkinter

我在这里尝试过搜索,但没有找到正确的答案 我有一个使用selection='multiple'设置的列表框。 然后,我尝试通过代码name.get(ACTIVE)获取用户选择的所有选项的列表。 问题是它并不总是得到我在列表框GUI中突出显示的所有选项。

如果我突出显示一个,它会正确地恢复它 如果我突出显示两个或更多(通过单击每个),它只返回我选择的最后一个项目 如果我有多个突出显示,但是然后点击取消突出显示一个,那就是我点击的最后一个,即使它没有突出显示也会被返回。

任何帮助都会非常棒。谢谢。我期待代码能够带回任何突出的内容。

设置列表框的代码是:

self.rightBT3 = Listbox(Frame1,selectmode='multiple',exportselection=0)

检索选择的代码是:

selection = self.rightBT3.get(ACTIVE)

这是应用程序在运行中的样子的屏幕截图,在顶部你可以看到控制台只注册了一个选项(我点击的最后一个)。

enter image description here

4 个答案:

答案 0 :(得分:8)

在Tkinter列表框中获取所选项目列表的正确方法似乎是使用self.rightBT3.curselection(),它返回一个包含所选行的从零开始的索引的元组。然后,您可以使用这些索引get()每行。

(我实际上没有测试过这个)

答案 1 :(得分:5)

我发现上述解决方案有点“模糊”。特别是当我们在这里处理正在学习工艺或学习python / tkinter的程序员时。

我想出了一个更具解释性的解决方案,其中包括以下内容。我希望这对你有好处。

#-*- coding: utf-8 -*-
# Python version 3.4
# The use of the ttk module is optional, you can use regular tkinter widgets

from tkinter import *
from tkinter import ttk

main = Tk()
main.title("Multiple Choice Listbox")
main.geometry("+50+150")
frame = ttk.Frame(main, padding=(3, 3, 12, 12))
frame.grid(column=0, row=0, sticky=(N, S, E, W))

valores = StringVar()
valores.set("Carro Coche Moto Bici Triciclo Patineta Patin Patines Lancha Patrullas")

lstbox = Listbox(frame, listvariable=valores, selectmode=MULTIPLE, width=20, height=10)
lstbox.grid(column=0, row=0, columnspan=2)

def select():
    reslist = list()
    seleccion = lstbox.curselection()
    for i in seleccion:
        entrada = lstbox.get(i)
        reslist.append(entrada)
    for val in reslist:
        print(val)

btn = ttk.Button(frame, text="Choices", command=select)
btn.grid(column=1, row=1)

main.mainloop()

请注意,使用ttk主题小部件是完全可选的。您可以使用普通的tkinter小部件。

答案 2 :(得分:3)

要获得在列表框中选择的文本项列表,我发现以下解决方案是最优雅的:

selected_text_list = [listbox.get(i) for i in listbox.curselection()]

答案 3 :(得分:0)

我也遇到了同样的问题。经过一番研究,我找到了一个可行的解决方案,该解决方案允许在列表框中进行多项选择。这并不理想,因为该字段中仍然缺少滚动条(存在附加值的 UX 线索)。但是,它确实允许进行多项选择。

from tkinter import *
window_app = Tk()


# ### Allows for multi-selections ###
def listbox_used(event):
    curselection = listbox.curselection()
    for index in curselection:
        print(listbox.get(index))  # Gets current selection from listbox
        # Only challenge with this implementation is the incremental growth of the list.
        # However, this could be resolved with a Submit button that gets the final selections.


listbox = Listbox(window_app, height=4, selectmode='multiple')
fruits = ["Apple", "Pear", "Orange", "Banana", "Cherry", "Kiwi"]
for item in fruits:
    listbox.insert(fruits.index(item), item)
listbox.bind("<<ListboxSelect>>", listbox_used)  # bind function allows any selection to call listbox_used function.
listbox.pack(padx=10, pady=10)  # Adds some padding around the field, because...fields should be able to breathe :D

window_app.mainloop()

免责声明:我只是在 100 天新兵训练营的第 27 天。如果我遗漏了一些明显的东西,我欢迎建设性的反馈。

此外,这是我在 StackOverflow 上的第一篇文章 :)