28

我试图使当前选定的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. 我选择了项目“一”,它打印出“一”
  2. 我选择了项目“二”,它再次打印出“一”
  3. 我选择了项目“三”,它打印出“二”等等......

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

4

5 回答 5

46

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

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

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

mylistbox.get(ACTIVE)

到:

mylistbox.get(mylistbox.curselection())

如果您需要处理MULTIPLEor 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将是一个字符串,与您插入的相同。

于 2013-03-28T01:25:18.527 回答
10

这似乎对我有用:

mylistbox.get(ANCHOR)

根据您的代码,它将打印出当前项目。

于 2016-11-06T11:04:25.053 回答
3

您可以使用它,它不需要列表框。因此,如果您有多个列表框,它将从任何

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(event):
    widget = event.widget
    selection=widget.curselection()
    picked = widget.get(selection[1])
    print(picked)

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()
于 2017-02-19T23:18:23.010 回答
1

如 user1576772 所述,正确答案应该是:

mylistbox.get(ANCHOR)

问题curselection()是它每次都返回当前选择的整个列表。

考虑一种情况,您滚动列表框并希望始终向前或向后获取最后一个选定的项目(不是突出显示列表中的最后一个项目,用户按下的最后一个项目)!curselection()将为您提供所有当前选择的项目,这很有帮助,但您永远不会知道最后选择了哪个项目!

于 2018-12-13T14:30:22.057 回答
-1

该行picked = widget.get(selection[1])应该是picked = widget.get(selection[0]).

否则,将出现“索引超出范围”错误。

于 2018-06-24T23:01:30.540 回答