2011-08-29 3 views
2

Lorsque je lier l'événement à une entrée et lire le contenu, la modification est en retard. Je veux "mettre à jour dynamiquement" une autre entrée qui montre le résultat d'un calcul du contenu de diverses entrées dès que l'entrée 1 est modifiée. Mais en quelque sorte le changement n'est pas reconnu instantanément, seul le précédent. Ne sais pas si le problème est clair: Si je fais n changements, les changements jusqu'à n-1 sont reconnus. Si le nombre était de 1000 et je presse backspace deux fois, entry_1.get() rapporterait 100 au lieu de 10. Je espère que vous comprenez ce que je veux dire maintenant :)Liaison <Key> à une entrée dans Tkinter

extrait de code (simplifié):

self.entry_1.bind('<Key>',lambda d: self.update()) 

def update(self): 
    success=True 
    try: 
     float(self.entry_1.get()) 
     float(self.entry_1.get()) 
    except ValueError: success=False 
    if success: 

     self.entry_3.delete(0,"end") 
     x=(float(self.entry_1.get())*float(self.entry_2.get()) 
     self.entry_3.insert("end", "%g" %x) 

Qu'est-ce que pourrait être la raison de cela?

+0

double possible (http [Comment lier des événements auto dans un widget Tkinter texte après qu'il binded par widget texte?]: // stackoverflow. com/questions/3501849/how-to-bind-self-events-in-tkinter-texte-widget-after-it-will-binded-by-text-widge) –

Répondre

3

La raison est due à l'ordre dans lequel les événements sont traités. Cet ordre est défini par le "tag de liaison" (ou bindtag) du widget. Par défaut, la commande est widget, class, toplevel, "all". Par exemple, si vous avez une liaison sur le widget, et sur la classe, et sur la fenêtre de haut niveau qui contient le widget, et sur le cas particulier "all", les liaisons se déclencheront dans cet ordre.

je lui ai donné une longue writeup de ce problème dans this answer à la question How to bind self events in Tkinter Text widget after it will binded by Text widget?

+0

Brillant, merci beaucoup! – Jakob

Questions connexes