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)