2008-11-06 8 views
14

Comment appelez-vous un tkinter event à partir d'un objet séparé?Tkinter: appel d'événement dans la boucle principale

Je cherche quelque chose comme wxWidgets wx.CallAfter. Par exemple, si je crée un objet et que je lui passe mon instance racine Tk, puis que j'essaie d'appeler une méthode de cette fenêtre racine à partir de mon objet, mon application se verrouille. Le meilleur que je peux trouver est d'utiliser la méthode after et de vérifier l'état de mon objet séparé, mais cela semble inutile.

Répondre

25

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) 
4

Voici ci-dessous quelques-unes doc et un lien pour mieux comprendre la réponse de Bryan ci-dessus.

Description de la fonction de New Mexico Tech:

w.event_generate(sequence, **kw)

Cette méthode provoque un événement pour déclencher sans stimulus externe. Le traitement de l'événement est le même que s'il avait été déclenché par un stimulus externe. L'argument de séquence décrit l'événement à déclencher. Vous pouvez définir des valeurs pour les champs sélectionnés dans l'objet Event en fournissant des arguments keyword = value, où le mot-clé spécifie le nom d'un champ dans l'objet Event.

liste

et description de l'événement tcl/tk attributs here

Questions connexes