2013-01-16 265 views
4

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

如果我强调一个,它会正确地返回。
如果我突出显示两个或多个(每个点击一次),它只返回我选择的最后一个项目
如果我有多个突出显示,但点击不亮选一个,这是我点击的最后一个返回即使它没有被强调。

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

代码来设置列表框是:

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

中检索的选择的代码是:

selection = self.rightBT3.get(ACTIVE) 

这是该应用程序看起来像在行动的截图,在顶部你可以看到控制台只注册了一个选择(我点击的最后一个)。

enter image description here

回答

6

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

(我没有实际测试过这虽然)

+0

听起来不错@Tharwen谢谢。我曾希望我错过了一个让我避免使用'curselection()'的技巧,但我不得不停止懒惰:) – Zenettii

3

我发现上面的解决方案一点点“晦涩”。特别是当我们在这里处理正在学习工艺或学习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的小部件。