问题: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.我选择了项目“一”,它打印出“一”

  1. 我选择了“二”项,它又打印出“一”

3.我选择了项目“三”,它打印出“二”等等......

我错过了什么吗?还是我误解了get(ACTIVE)的工作方式?

解答

一个项目在您单击后变为活动状态 — 这意味着在您的ListboxSelect方法返回之后。因此,您将打印出_before_ 这次点击(通常是指您_最后一次_点击的内容)。

此外,鉴于您多次提到“选择”,我认为您想要的是 selected 值,而不是 active 值,因此您应该要求这样做。

对于带有selectmode=SINGLEBROWSE(默认值,您拥有的)列表框的列表框,您可以轻松修复这两个。只需更改此:

mylistbox.get(ACTIVE)

至:

mylistbox.get(mylistbox.curselection())

如果您需要处理MULTIPLEEXTENDED,那么当然有 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的结果将是一个字符串,与您插入的相同。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐