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