Python tkinter listbox evento de enlace

Tengo problemas para conseguir que un enlace de evento funcione con python / tkinter. Simplemente estoy tratando de hacer clic y tener la ubicación impresa, pero cada vez que hago esto, el resultado es “-1”.

Aquí está mi código

from Tkinter import * import Tkinter class make_list(Tkinter.Listbox): def __init__(self,master, **kw): frame = Frame(master) frame.pack() self.build_main_window(frame) kw['selectmode'] = Tkinter.SINGLE Tkinter.Listbox.__init__(self, master, kw) master.bind('', self.click_button) master.curIndex = None #display the clicked location def click_button(self, event): self.curIndex = self.nearest(event.x) print self.curIndex #display the window, calls the listbox def build_main_window(self, frame): self.build_listbox(frame) #listbox def build_listbox(self, frame): listbox = Listbox(frame) for item in ["one", "two", "three", "four"]: listbox.insert(END, item) listbox.insert(END, "a list entry") listbox.pack() return if __name__ == '__main__': tk = Tkinter.Tk() make_list(tk) tk.mainloop() 

código actualizado: me deshice del marco, pero parece que no entiendo por qué obtengo -1 para la primera statement de impresión en la función click_button

 from Tkinter import * import Tkinter class make_list(Tkinter.Listbox): #display the clicked location def click_button(self, event): ##this block works w = event.widget index = int(w.curselection()[0]) value = w.get(index) print value ##this doesn't self.curIndex = self.nearest(event.y) print self.curIndex self.curIndex = event.widget.nearest(event.y) print self.curIndex #display the window, calls the listbox def build_main_window(self): self.build_listbox() #listbox def build_listbox(self): listbox = Listbox() listbox.bind('<>', self.click_button) for item in ["one", "two", "three", "four"]: listbox.insert(END, item) listbox.insert(END, "a list entry") listbox.pack() return if __name__ == '__main__': tk = Tkinter.Tk() start = make_list(tk) start.build_main_window() start.mainloop() 

listbox elemento más cercano al listbox se encuentra con y , no con x .

  self.nearest(event.x) # wrong self.nearest(event.y) # right 

Actualización: no noté el problema real primero:

  listbox = Listbox(frame) 

No es el mismo cuadro de lista que subclasificó, es otro cuadro de lista no relacionado. Su cuadro de lista (que es make_list) está vacío, por eso siempre devuelve -1 para el más cercano.

Quizás subclasificar un marco es una buena idea (de todos modos, es mejor que crear subclases en el cuadro de lista y agregar un marco con otro cuadro de lista). Entonces tendrás que vincular el evento en ese cuadro de lista real que no esté vacío.

Una forma rápida de ver cómo funcionará cuando se solucione es llamar al nearest de un cuadro de lista real con event.widget :

 self.curIndex = event.widget.nearest(event.y) 

En los comentarios de una respuesta pides la mejor práctica. La mejor práctica es enlazar a <> que se activará inmediatamente después de seleccionar el elemento en el cuadro de lista.

Esta respuesta a una pregunta similar tiene un ejemplo.