python listbox.get_Python tkinter listbox get (ACTIVE) method

问题

I was trying to make the currently selected List box item to be printed out. For example, when i select item "one", it should print out "one" and when i select item "two", it should print out "two" etc. The following is what i have tried.

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('<>',CurSelet)

mylistbox.place(x=32,y=90)

for items in itemsforlistbox:

mylistbox.insert(END,items)

root.mainloop()

My problem is whenever i selected an item in the listbox, it is actually printing out the previously selected item.For example, the moment i select the item "two" in the list, it is printing out "one". To make things more clear,please see the following

(1) i selected the item "one", it printed out "one"

(2) i selected the item "two", it print out "one" again

(3) i selected the item "three", it print out "two"

and so on...

Am i missing something? or did i misunderstand the way the get(ACTIVE) works? Appreciate for your help.

回答1:

An item becomes active after you click on it—which means after your ListboxSelect method returns. So, you're printing out whatever was active before this click (meaning, generally, what you clicked last time).

Also, given that you refer to "selected" numerous times, I think what you want is the selected value(s), not the active one, so you should be asking for that.

For a listbox with selectmode=SINGLE or BROWSE (the default, what you have) listbox, you can fix both of these trivially. Just change this:

mylistbox.get(ACTIVE)

to:

mylistbox.get(mylistbox.curselection())

If you need to handle MULTIPLE or EXTENDED, then of course there are anywhere from 0 to 7 selections instead of exactly 1, so you need to do something like:

values = [mylistbox.get(idx) for idx in mylistbox.curselection()]

print ', '.join(values)

While we're at it, I'm not sure why you were doing str((mylistbox.get(ACTIVE))), or even str(mylistbox.get(ACTIVE)). The result of mylistbox.get with a single index is going to be a string, the same one you inserted.

回答2:

This seems to work for me:

mylistbox.get(ANCHOR)

Based on your code, it will print out the current item.

回答3:

You could use this, it doesn't require the list box. So if you have multiple list boxes it will retrieve the value from any

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('<>',CurSelet)

mylistbox.place(x=32,y=90)

for items in itemsforlistbox:

mylistbox.insert(END,items)

root.mainloop()

回答4:

as stated by user1576772 the correct answer should be :

mylistbox.get(ANCHOR)

The Problem with curselection() is it returns the whole list currently selected each time.

consider a situation where you scroll through a Listbox and want always to get the last selected item forward or backward (not the last item in highlighted list , the last item pressed on by user )! curselection() will give you all the currently selected items which is helpful but you will never know which item was selected last !

回答5:

The line picked = widget.get(selection[1]) should be picked = widget.get(selection[0]).

Otherwise, there will be an "index out of range" error.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值