2008-11-06 17 views
14

¿Cómo invocar un tkinter event desde un objeto separado?Tkinter: invocar evento en el bucle principal

Estoy buscando algo así como wxWidgets wx.CallAfter. Por ejemplo, si creo un objeto y paso a mi instancia de raíz Tk, y luego intento llamar a un método de esa ventana raíz desde mi objeto, mi aplicación se bloquea.

Lo mejor que se me ocurre es usar el método after y verificar el estado de mi objeto por separado, pero eso parece un desperdicio.

Respuesta

25

Para responder a su pregunta específica de "Cómo invocar un evento TkInter desde un objeto separado", use el comando event_generate. Le permite inyectar eventos en la cola de eventos de la ventana raíz. Combinado con el poderoso mecanismo de eventos virtuales de Tk, se convierte en un útil mecanismo de transmisión de mensajes.

Por ejemplo:

from tkinter import * 

def doFoo(*args): 
    print("Hello, world") 

root = Tk() 
root.bind("<<Foo>>", doFoo) 

# some time later, inject the "<<Foo>>" virtual event at the 
# tail of the event queue 
root.event_generate("<<Foo>>", when="tail") 

Tenga en cuenta que la llamada event_generate volverá inmediatamente. No está claro si eso es lo que quieres o no. En términos generales, no desea que un programa basado en eventos bloquee la espera de una respuesta a un evento específico porque se se congelará la GUI.

No estoy seguro si esto resuelve tu problema; sin ver tu código, no estoy seguro de cuál es tu problema real. Puedo, por ejemplo, acceder a los métodos de root en el constructor de un objeto donde se transfiere la raíz sin que la aplicación se bloquee. Esto me dice que hay algo más en tu código.

He aquí un ejemplo de acceder con éxito métodos en una ventana raíz de algún otro objeto:

from tkinter import * 

class myClass: 
    def __init__(self, root): 
     print("root background is %s" % root.cget("background")) 

root = Tk() 
newObj = myClass(root) 
4

A continuación sólo algunas doc y enlace a entender mejor la respuesta de Bryan anteriormente.

descripción de la función de New Mexico Tech:

w.event_generate(sequence, **kw)

Este método provoca un evento para activar sin ningún estímulo externo. El manejo del evento es el mismo que si hubiera sido activado por un estímulo externo. El argumento de secuencia describe el evento que se activará. Puede establecer valores para los campos seleccionados en el objeto Evento proporcionando argumentos palabra clave = valor, donde la palabra clave especifica el nombre de un campo en el objeto Evento.

lista y descripción de evento tcl/tk atributos here

Cuestiones relacionadas