Python Tkinter多选列表框

Python Tkinter多选列表框,python,tkinter,Python,Tkinter,我尝试在这里搜索,但没有找到正确答案。 我有一个列表框,它是用selection='multiple'设置的。 然后,我尝试通过codename.get(ACTIVE)获取用户选择的所有选项的列表。 问题是它并不总是获得我在listbox GUI中突出显示的所有选项 如果我突出显示一个,它将正确地返回该值。 如果我突出显示两个或多个项目(通过单击每个项目),则只返回我选择的最后一个项目 如果有多个高亮显示,但单击取消高亮显示一个,则返回的是我单击的最后一个,即使它未高亮显示 任何帮助都会非常好。

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

如果我突出显示一个,它将正确地返回该值。
如果我突出显示两个或多个项目(通过单击每个项目),则只返回我选择的最后一个项目
如果有多个高亮显示,但单击取消高亮显示一个,则返回的是我单击的最后一个,即使它未高亮显示

任何帮助都会非常好。谢谢我希望代码能够带回突出显示的内容

设置列表框的代码为:

self.rightBT3 = Listbox(Frame1,selectmode='multiple',exportselection=0)
检索选择的代码为:

selection = self.rightBT3.get(ACTIVE)
这是应用程序运行时的屏幕截图,在顶部,您可以看到控制台仅注册了一个选择(我单击的最后一个)


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


(不过我还没有实际测试过)

我发现上面的解决方案有点“模糊”。特别是当我们在这里与学习这门手艺或学习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的小部件。

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

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

我也遇到了同样的问题。经过一些研究,我找到了一个可行的解决方案,允许在列表框中进行多项选择。这并不理想,因为字段中仍然缺少滚动条(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()
从tkinter导入*
window_app=Tk()
#####允许多选###
使用的def列表框(事件):
curselection=listbox.curselection()
有关选举中的索引:
打印(listbox.get(index))#从listbox获取当前选择
#此实现的唯一挑战是列表的增量增长。
#但是,这可以通过一个获取最终选择的提交按钮来解决。
listbox=listbox(窗口应用程序,高度=4,选择mode='multiple')
水果=[“苹果”、“梨”、“橙子”、“香蕉”、“樱桃”、“猕猴桃”]
水果类食品:
列表框.插入(水果.索引(项目),项目)
bind(“,listbox_used)#bind函数允许任何选择调用listbox_used函数。
pack(padx=10,pady=10)#在字段周围添加一些填充,因为…字段应该能够呼吸:D
窗口应用程序mainloop()
免责声明:我只是在为期100天的新兵训练营的第27天。如果我错过了一些明显的东西,我欢迎建设性的反馈


另外,这是我在StackOverflow上的第一篇帖子:)

听起来不错@Tharwen谢谢。我希望我错过了一个可以避免使用
curselection()
的技巧,但我必须停止懒惰:)是的,这是一个更好的答案。。。只是为我工作