Maison  >  Article  >  développement back-end  >  Comment pouvez-vous exécuter du code personnalisé après la mise à jour du texte dans le widget Texte de Tkinter ?

Comment pouvez-vous exécuter du code personnalisé après la mise à jour du texte dans le widget Texte de Tkinter ?

DDD
DDDoriginal
2024-11-03 20:03:29757parcourir

How can you execute custom code after text updates in Tkinter's Text widget?

Comment fonctionnent les liaisons dans le widget de texte Tkinter ?

Dans Tkinter, lorsque vous interagissez avec un widget de texte, vos frappes déclenchent les liaisons associées avec le widget. Ces liaisons déterminent la manière dont le texte est mis à jour au fur et à mesure que vous tapez. Cependant, il existe des cas où vous souhaiterez peut-être exécuter votre propre code après que des mises à jour de texte ont eu lieu via des liaisons de classe intégrées.

Dans les coulisses : liaison des balises et gestion des événements

Tkinter utilise des balises de liaison pour gérer les événements. Chaque widget possède une balise de liaison portant le même nom que le widget, et d'autres balises de liaison incluent la classe du widget, le chemin de la fenêtre racine et la balise générale « tout ». Les widgets se voient attribuer des balises de liaison qui traitent les événements dans l'ordre, en commençant par le plus spécifique (widget) et en terminant par le moins spécifique (tous).

Résoudre le problème d'ordre de liaison

Pour lier des événements auto-définis après les liaisons de classe, vous avez deux options : réorganiser les balises de liaison ou introduire une nouvelle balise de liaison.

Option 1 : Réorganiser les balises de liaison

En ajustant la séquence des balises de liaison, vous pouvez donner la priorité au traitement des événements de vos liaisons personnalisées par rapport aux liaisons de classe. Par exemple, si vous avez une balise de liaison représentant le widget ("entry1" dans le code ci-dessous), déplacez-la sous la balise de liaison de classe ("Entry") dans la liste des balises de liaison :

<code class="python">entry1.bindtags(('Entry', '.entry1', '.', 'all'))</code>

Option 2 : introduction d'une nouvelle balise de liaison

Vous pouvez également créer une balise de liaison supplémentaire qui suit la balise de liaison de classe. Vos liaisons seront alors attachées à cette nouvelle balise :

<code class="python">entry3.bindtags(('.entry3','Entry','post-class-bindings', '.', 'all'))

# Custom bindings are attached to the 'post-class-bindings' tag
entry3.bind_class("post-class-bindings", "<KeyPress>", OnKeyPress)</code>

Exemple de code

Le code suivant illustre l'utilisation de ces techniques :

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

entry1.bindtags(('.entry1', 'Entry', '.', 'all'))
entry2.bindtags(('Entry', '.entry2', '.', 'all'))
entry3.bindtags(('.entry3','Entry','post-class-bindings', '.', 'all'))

# Custom bindings are attached to the default tags
entry1.bind("<KeyPress>", OnKeyPress)

# Custom bindings are attached to the reordered tags
entry2.bind("<KeyPress>", OnKeyPress)

# Custom bindings are attached to the new 'post-class-bindings' tag
entry3.bind_class("post-class-bindings", "<KeyPress>", OnKeyPress)

root.mainloop()</code>

En exécutant ce code et en appuyant sur les touches des trois widgets d'entrée, vous remarquerez que les liaisons du premier widget d'entrée semblent être en retard d'un caractère en raison de l'ordre de liaison par défaut. Cependant, les liaisons pour les deuxième et troisième widgets d'entrée mettent à jour le texte correctement au fur et à mesure que vous tapez.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn