Liaison d'événements personnalisés dans le widget de texte Tkinter après les liaisons intégrées
Comprendre le problème
Dans le widget Texte de Tkinter, vous pouvez rencontrer une situation dans laquelle vos liaisons d'événements personnalisées sont exécutées avant les liaisons intégrées du widget, provoquant des écarts dans les mises à jour du texte.
Solution
Pour résoudre ce problème, vous pouvez modifier l'ordre dans lequel les événements sont traités. Les widgets Tkinter se voient attribuer une hiérarchie de "bindtags" qui déterminent l'ordre d'exécution de la liaison.
1. Réorganisation des Bindtags
L'ordre par défaut des bindtags est : widget, classe, niveau supérieur, tous. Vous pouvez modifier l'ordre en plaçant le bindtag du widget après le bindtag de la classe. De cette façon, les liaisons de classe s'exécuteront avant les liaisons de widgets.
<code class="python"># Modify the bindtags to rearrange the order entry.bindtags(('Entry', '.entry', '.', 'all'))</code>
2. Présentation de Bindtags supplémentaires
Vous pouvez également créer un nouveau bindtag après le bindtag de classe et lier vos événements personnalisés à cette nouvelle balise.
<code class="python"># Create a new bindtag "post-class-bindings" after the class bindtag entry.bindtags(('.entry','Entry','post-class-bindings', '.', 'all')) # Bind your custom events to "post-class-bindings" entry.bind_class("post-class-bindings", "<KeyPress>", OnKeyPress)</code>
Avantages des deux approches
Exemple de code
Le code suivant illustre les deux approches :
<code class="python">import Tkinter def OnKeyPress(event): value = event.widget.get() string="value of %s is '%s'" % (event.widget._name, value) status.configure(text=string) root = Tkinter.Tk() entry1 = Tkinter.Entry(root, name="entry1") entry2 = Tkinter.Entry(root, name="entry2") entry3 = Tkinter.Entry(root, name="entry3") # Three different bindtags entry1.bindtags(('.entry1', 'Entry', '.', 'all')) entry2.bindtags(('Entry', '.entry2', '.', 'all')) entry3.bindtags(('.entry3','Entry','post-class-bindings', '.', 'all')) # Bind the first two entries to the default bind tags entry1.bind("<KeyPress>", OnKeyPress) entry2.bind("<KeyPress>", OnKeyPress) # Bind the third entry to the "post-class-bindings" bind tag entry3.bind_class("post-class-bindings", "<KeyPress>", OnKeyPress) # ... Continue with your GUI code </code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!