Python tkinter listbox get(ACTIVE)方法

Chr*_*ung 13 python tkinter widget

我试图打印出当前选中的列表框项目.例如,当我选择项目"one"时,它应该打印出"one",当我选择项目"two"时,它应该打印出"two"等.以下是我尝试过的.

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()
Run Code Online (Sandbox Code Playgroud)

我的问题是每当我在列表框中选择一个项目时,它实际上是打印出先前选择的项目.例如,当我在列表中选择项目"两个"时,它打印出"一个".为了使事情更清楚,请参阅以下内容

(1)我选择了"一"项,打印出"一"

(2)我选择了项目"two",它再次打印出"one"

(3)我选择了"三"项,打印出"两个"等等......

我错过了什么吗?还是我误解了get(ACTIVE)的工作方式?感谢您的帮助.

aba*_*ert 26

单击它后,项目将变为活动状态 - 这意味着在您的ListboxSelect方法返回后.因此,您在打印之前打印出任何活动的内容(通常意味着您上次点击的内容).

另外,鉴于你多次提到"选定",我认为你想要的是所选择的值,而不是活跃的值,所以你应该要求它.

对于带有selectmode=SINGLEBROWSE(默认情况下,您拥有的)列表框的列表框,您可以轻松地修复这两个问题.只需改变这个:

mylistbox.get(ACTIVE)
Run Code Online (Sandbox Code Playgroud)

至:

mylistbox.get(mylistbox.curselection())
Run Code Online (Sandbox Code Playgroud)

如果你需要处理MULTIPLE或者EXTENDED,当然有0到7个选择而不是1个,所以你需要做类似的事情:

values = [mylistbox.get(idx) for idx in mylistbox.curselection()]
print ', '.join(values)
Run Code Online (Sandbox Code Playgroud)

虽然我们正在努力,但我不确定你为什么这么做,str((mylistbox.get(ACTIVE)))甚至不知道str(mylistbox.get(ACTIVE)).mylistbox.get单个索引的结果将是一个字符串,与您插入的字符串相同.

  • @ChrisAung:简而言之:Tk 是脚本语言 Tcl 的内置 GUI。Tkinter 是 Python 的内置 GUI,是一组围绕 Tcl/Tk 的包装器,是用 Python 和 Tcl 的组合编写的。这就是为什么 [Tkinter 文档](http://docs.python.org/2/library/tkinter.html) 链接到 [Tcl/Tk 手册](http://www.tcl.tk/man/tcl8 .5/) 和其他各种相关文档。 (4认同)

Him*_*Das 5

这似乎对我有用:

mylistbox.get(ANCHOR)
Run Code Online (Sandbox Code Playgroud)

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