tkinter listbox get(ACTIVE) 方法
·
问题:tkinter listbox get(ACTIVE) 方法
我试图让当前选择的Listbox项目被打印出来。例如,当我选择项目“一”时,它应该打印出“一”,当我选择项目“二”时,它应该打印出“二”等。以下是我尝试过的。
from Tkinter import*
root=Tk()
sizex = 600
sizey = 400
posx = 40
posy = 20
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
itemsforlistbox=['one','two','three','four','five','six','seven']
def CurSelet(evt):
value=str((mylistbox.get(ACTIVE)))
print value
mylistbox=Listbox(root,width=60,height=10,font=('times',13))
mylistbox.bind('<<ListboxSelect>>',CurSelet)
mylistbox.place(x=32,y=90)
for items in itemsforlistbox:
mylistbox.insert(END,items)
root.mainloop()
我的问题是每当我在列表框中选择一个项目时,它实际上是在打印出之前选择的项目。例如,当我在列表中选择项目“二”时,它正在打印出“一”。为了让事情更清楚,请参阅以下内容
1.我选择了项目“一”,它打印出“一”
- 我选择了“二”项,它又打印出“一”
3.我选择了项目“三”,它打印出“二”等等......
我错过了什么吗?还是我误解了get(ACTIVE)的工作方式?
解答
一个项目在您单击后变为活动状态 — 这意味着在您的ListboxSelect方法返回之后。因此,您将打印出_before_ 这次点击(通常是指您_最后一次_点击的内容)。
此外,鉴于您多次提到“选择”,我认为您想要的是 selected 值,而不是 active 值,因此您应该要求这样做。
对于带有selectmode=SINGLE或BROWSE(默认值,您拥有的)列表框的列表框,您可以轻松修复这两个。只需更改此:
mylistbox.get(ACTIVE)
至:
mylistbox.get(mylistbox.curselection())
如果您需要处理MULTIPLE或EXTENDED,那么当然有 0 到 7 个选择而不是 1,因此您需要执行以下操作:
values = [mylistbox.get(idx) for idx in mylistbox.curselection()]
print ', '.join(values)
当我们这样做时,我不确定您为什么要使用str((mylistbox.get(ACTIVE))),甚至是str(mylistbox.get(ACTIVE))。具有单个索引的mylistbox.get的结果将是一个字符串,与您插入的相同。
更多推荐

所有评论(0)