Python: Comment obtenir un texte d'entrée mis à jour à utiliser dans une commande binded à elle?
-
28-09-2019 - |
Question
Considérez le code suivant:
text = Entry(); text.pack()
def show(e):
print text.get()
text.bind('<Key>', show)
Le mot Let je mets les lettres ABC dans l'entrée, un par un. La sortie serait:
>>>
>>> A
>>> AB
Notez que lorsque vous appuyez sur A, il imprime une chaîne vide. Quand je presse B, il imprime A, pas AB. Si je ne rien de presse après C, il ne sera jamais montré. Il semble que le contenu d'entrée est mis à jour uniquement après la commande binded est de retour, donc je ne peux pas utiliser la valeur d'entrée réelle dans cette fonction.
Y at-il moyen d'obtenir une valeur d'entrée mis à jour pour utiliser à l'intérieur d'une commande binded?
La solution
Vous pourriez remplacer l'événement <Key>
avec l'événement <KeyRelease>
. Cela devrait fonctionner.
Voici une liste des événements: http: / /infohost.nmt.edu/tcc/help/pubs/tkinter/events.html#event-types
Autres conseils
La raison doit faire avec Tk « bindtags ». Les liaisons sont associées avec des étiquettes, et les liaisons sont traitées dans l'ordre d'étiquette. Les deux noms et classes widget widget sont des balises, et ils sont traités dans cet ordre (liaisons spécifiques-widget d'abord, les liaisons de seconde classe).
Pour cette raison, chaque fois que vous appuyez sur une touche de liaison spécifique de votre widget feu avant la classe de liaison a une chance de modifier le widget.
Il y a beaucoup de solutions de contournement. Le plus simple est de se lier à <KeyRelease>
puisque les liaisons de classe se produisent sur la touche. Il existe d'autres solutions qui impliquent soit en ajoutant ou en réorganisant les balises lient, ou à l'aide de la fonctions intégrées de validation des données du widget d'entrée. Ce qui est le mieux dépend de ce que vous êtes vraiment essayer d'accomplir.
Pour plus d'informations sur les fonctions de validation des données, voir cette question: interactivement validation contenu widget Entrée en tkinter
Pour une réponse plus complète, voir Tkinter: set LaChaine après