¿Cómo puedo obtener el valor de los datos que se estableció en la función “event_generate”?

Estoy usando Python 2.7.4 y nuevo en Tkinter, y estoy atascado con el siguiente código. Generé una “prueba” de eventos y configuré la opción “datos” con una cadena, pero se produjo un error al recuperarlo del evento.

Error -> AttributeError: la instancia del evento no tiene atributo ‘datos’

from Tkinter import * def handle_it(event): # print "event handler" print event.data root = Tk() root.after(1, lambda: root.event_generate('<>', data="hi there")) root.bind('<>', handle_it) root.mainloop() 

No puedo encontrar los documentos de Python relacionados para este caso, por lo que me referí al documento tcl que se encuentra a continuación http://www.tcl.tk/man/tcl8.5/TkCmd/event.htm#M14

¿TKinter of Python 2.7 admite la opción de “datos”? ¡Gracias!

No, lamentablemente no es así. El intérprete de Tcl lo reconoce como una opción válida, pero es una de las opciones que faltan que no están incluidas en la clase Evento, como warp . Puede echar un vistazo a la línea 1188 del código fuente de Tkinter para ver el rest de las opciones que faltan.

Tkinter no maneja correctamente el campo de datos de event_generate.

Aquí hay un fragmento usando la API privada de Tkinter (de hecho Tcl …) que permite leer este campo. Esta función solo funciona con literales y, por lo general, transfiero datos a un diccionario con literales.

 from Tkinter import * def handle_it(event): # print "event handler" print event.data def bind_event_data(widget, sequence, func, add = None): def _substitute(*args): e = lambda: None #simplest object with __dict__ e.data = eval(args[0]) e.widget = widget return (e,) funcid = widget._register(func, _substitute, needcleanup=1) cmd = '{0}if {{"[{1} %d]" == "break"}} break\n'.format('+' if add else '', funcid) widget.tk.call('bind', widget._w, sequence, cmd) root = Tk() # unfortunately, does not work with my snippet (the data argument is eval-ed) # you can adapt it to handle raw string. root.after(100, lambda : root.event_generate('<>', data="hi there")) # works, but definitely looks too hacky root.after(100, lambda : root.event_generate('<>', data="'hi there'")) # the way I typically use it root.after(100, lambda : root.event_generate('<>', data={"content": "hi there"})) #should be: # root.bind('<>', handle_it) bind_event_data (root, '<>', handle_it) root.mainloop() 

Nota: parece que hay una condición de carrera que impide que el evento sea atrapado con un retraso demasiado pequeño.