Consulta básica sobre bindtags en tkinter

En el ejemplo dado de esta publicación , se mencionó que si se usan tags de enlace predeterminadas, el valor del evento no será visible dentro de la definición (habrá un retraso de uno en uno).

Hubo alguna explicación con respecto a la unión de clases.
Soy un principiante, por lo que me gustaría entender la razón detallada.
¿Pueden algunos explicar por qué no funcionó en el primer caso y en el segundo (cuando se modifica el orden de las tags de enlace)?

import Tkinter def OnKeyPress(event): value = event.widget.get() string="value of %s is '%s'" % (event.widget._name, value) status.configure(text=string) root = Tkinter.Tk() entry1 = Tkinter.Entry(root, name="entry1") entry2 = Tkinter.Entry(root, name="entry2") entry3 = Tkinter.Entry(root, name="entry3") entry1.bindtags(('.entry1', 'Entry', '.', 'all')) entry2.bindtags(('Entry', '.entry1', '.', 'all')) entry3.bindtags(('.entry1','Entry','post-class-bindings', '.', 'all')) btlabel1 = Tkinter.Label(text="bindtags: %s" % " ".join(entry1.bindtags())) btlabel2 = Tkinter.Label(text="bindtags: %s" % " ".join(entry2.bindtags())) btlabel3 = Tkinter.Label(text="bindtags: %s" % " ".join(entry3.bindtags())) status = Tkinter.Label(anchor="w") entry1.grid(row=0,column=0) btlabel1.grid(row=0,column=1, padx=10, sticky="w") entry2.grid(row=1,column=0) btlabel2.grid(row=1,column=1, padx=10, sticky="w") entry3.grid(row=2,column=0) btlabel3.grid(row=2,column=1, padx=10) status.grid(row=3, columnspan=2, sticky="w") entry1.bind("", OnKeyPress) entry2.bind("", OnKeyPress) entry3.bind_class("post-class-bindings", "", OnKeyPress) root.mainloop() 

Cuando realiza un enlace en un widget, en realidad no está enlazando a un widget en sí. Cuando haces mywidget.bind(...) , lo que realmente está sucediendo es que el enlace está asociado con una etiqueta de enlace con el mismo nombre que el widget.

Cuando se detecta un evento, Tkinter primero averigua qué widget interceptó el evento. Este widget tendrá una lista de cero o más (de forma predeterminada: cuatro) tags de enlace asociadas a él. Tkinter verificará cada etiqueta para ver si hay un enlace que coincida con el evento. Si encuentra uno, ejecutará el enlace y luego continuará hasta la siguiente etiqueta, hasta que se quede sin tags o una de las funciones enlazadas devuelva la cadena "break" .

La secuencia se ve algo como esto:

  1. Presionas la tecla “x”. En este punto, la “x” no se ha insertado en ninguna parte
  2. Tkinter obtiene las tags de enlace para el widget que tiene el foco del teclado.
  3. Por defecto, la primera etiqueta de enlace es el propio widget. ¿Hay un enlace en esa etiqueta? Si es así, ejecútalo. Por ejemplo, puede imprimir el contenido del widget. Debido a que aún no se han activado otros enlaces, la “x” no será parte del contenido.
  4. Si la función enlazada devuelve "break" , no se realiza más procesamiento de eventos. La “x” no se insertará en el widget.
  5. Si el widget no devolvió "break" , tkinter pasa a la siguiente etiqueta de enlace.
  6. De forma predeterminada, la siguiente etiqueta de enlace es la clase de widget. ¿Hay algún enlace en la clase que coincida con este evento (una pulsación de tecla de la letra “x”)?
  7. En este caso, la clase tiene un enlace para este evento, que consiste en insertar la “x” en el widget. Hasta este punto, la “x” aún no se ha insertado en el widget . Después de este enlace, sin embargo, si hiciera una impresión del contenido, vería la “x”
  8. El procesamiento continúa de esta manera hasta que se hayan procesado todas las tags de enlace.

Sobre la base de la discusión en curso en la sección de comentarios, parece que esto aún no está claro. Intentaré hacer esto lo más simple posible:

Es el enlace de clase el que copia un carácter del objeto de evento en memoria al widget y, por lo tanto, hace que aparezca en la pantalla. Antes de que se active el enlace de clase, el carácter no aparecerá en el widget. Después del enlace de clase estará en el widget.