La etiqueta Tkinter vinculada a StringVar está un clic atrás al actualizar

El problema que estoy encontrando aquí es que, cuando hago clic en los diferentes nombres de archivos en el Listbox , la Label cambia de valor un clic detrás de lo que esté haciendo clic en.

¿Que me estoy perdiendo aqui?

 import Tkinter as tk class TkTest: def __init__(self, master): self.fraMain = tk.Frame(master) self.fraMain.pack() # Set up a list box containing all the paths to choose from self.lstPaths = tk.Listbox(self.fraMain) paths = [ '/path/file1', '/path/file2', '/path/file3', ] for path in paths: self.lstPaths.insert(tk.END, path) self.lstPaths.bind('', self.update_label) self.lstPaths.pack() self.currentpath = tk.StringVar() self.lblCurrentPath = tk.Label(self.fraMain, textvariable=self.currentpath) self.lblCurrentPath.pack() def update_label(self, event): print self.lstPaths.get(tk.ACTIVE), print self.lstPaths.curselection() self.currentpath.set(self.lstPaths.get(tk.ACTIVE)) root = tk.Tk() app = TkTest(root) root.mainloop() 

El problema tiene que ver con el diseño fundamental de Tk. La versión corta es, los enlaces en widgets específicos se activan antes que los enlaces de clase predeterminados para un widget. Es en los enlaces de clase que se cambia la selección de un cuadro de lista. Esto es exactamente lo que observa: está viendo la selección antes del clic actual.

La mejor solución es enlazar al evento virtual <> que se <> después de que la selección haya cambiado. Otras soluciones (exclusivas de Tk y lo que le da algo de su increíble poder y flexibilidad) es modificar el orden en que se aplican los enlaces. Esto implica mover el widget bindtag después de la clase bindtag, o agregar un nuevo bindtag después de la clase bindtag y vincularlo a eso.

Dado que enlazar con <> es la mejor solución, no entraré en detalles sobre cómo modificar las tags de enlace, aunque es sencillo y creo que está bastante bien documentado.