我在这里尝试过搜索,但没有找到正确的答案
我有一个使用selection='multiple'
设置的列表框。
然后,我尝试通过代码name.get(ACTIVE)
获取用户选择的所有选项的列表。
问题是它并不总是得到我在列表框GUI中突出显示的所有选项。
如果我突出显示一个,它会正确地恢复它 如果我突出显示两个或更多(通过单击每个),它只返回我选择的最后一个项目 如果我有多个突出显示,但是然后点击取消突出显示一个,那就是我点击的最后一个,即使它没有突出显示也会被返回。
任何帮助都会非常棒。谢谢。我期待代码能够带回任何突出的内容。
设置列表框的代码是:
self.rightBT3 = Listbox(Frame1,selectmode='multiple',exportselection=0)
检索选择的代码是:
selection = self.rightBT3.get(ACTIVE)
这是应用程序在运行中的样子的屏幕截图,在顶部你可以看到控制台只注册了一个选项(我点击的最后一个)。
答案 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 上的第一篇文章 :)