Pour répondre à votre question spécifique "Comment appeler un événement TkInter à partir d'un objet séparé", utilisez la commande event_generate
. Il vous permet d'injecter des événements dans la file d'attente des événements de la fenêtre racine. Combiné avec le puissant mécanisme d'événement virtuel de Tk, il devient un mécanisme de passage de message pratique.
Par exemple:
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")
Notez que l'appel event_generate
retournera immédiatement. Ce n'est pas clair si c'est ce que vous voulez ou non. En règle générale, vous ne voulez pas qu'un programme basé sur un événement bloque l'attente d'une réponse à un événement spécifique, car il va bloquer l'interface graphique .
Je ne suis pas sûr si cela résout votre problème si; sans voir votre code je ne suis pas sûr de ce que votre vrai problème est. Je peux, par exemple, accéder à des méthodes de root dans le constructeur d'un objet où la racine est passée sans que l'application ne se bloque. Cela me dit qu'il se passe quelque chose d'autre dans votre code.
Voici un exemple d'accéder avec succès des méthodes sur une fenêtre racine d'un autre objet:
from tkinter import *
class myClass:
def __init__(self, root):
print("root background is %s" % root.cget("background"))
root = Tk()
newObj = myClass(root)