2017-10-05 2 views
0

Lorsque l'utilisateur double-clique sur un mot dans un widget Texte, un rappel interne est appelé, ce qui entraîne la sélection d'un mot. Je veux avoir une tâche additionnelle à faire sur ce mot. Comment puis je faire ça? L'idée naïve était de lier mon propre rappel au double clic. Cela n'a pas fonctionné, à cause d'une mauvaise priorité: mon rappel a été exécuté en premier, avant que le mot ne soit sélectionné, et le rappel de texte a été appelé après. Comment puis-je résoudre ce problème?Tkinter Text: appel d'une fonction personnalisée avec le mot sélectionné en double-cliquant

Une idée serait de retreive une poignée pour le rappel existant et le réutiliser après:

actual_callback = **<how can I get this handle?>**  
text.bind("<Double-Button-1>", my_callback) 

alors mon rappel serait carrément écrire comme suit:

def my_callback(event): 
    actual_callback(event) # this will select the word 
    w = text.selection_get() 
    do_something(w) 

S'il vous plaît aider à finaliser cette manière, ou n'hésitez pas à proposer un meilleur moyen d'atteindre mon objectif initial.

Répondre

3

La réponse facile est simplement d'attendre un temps avant d'exécuter votre rappel.

text.bind("<Double-Button-1>", lambda e: text.after(2, my_callback, e)) # wait 2 ms before running callback 
+0

Wow. Je suis impressionné. Je ne connaissais pas cette méthode Text.after. Cela a fonctionné à la perfection. Merci. – quickbug

+0

Je pense que 'text.after (0, my_callback, e)' fonctionnerait aussi bien. Il devrait affecter le rappel à l'événement suivant après que l'événement de clic en cours est terminé. Je pense aussi que vous pouvez avoir une faute de frappe: 'wait a beat' –

+0

@quickbug la méthode' after() 'est la façon dont vous effectuez des actions minutées dans tkinter car' wait() 'et' sleep() 'provoqueront l'ensemble de votre programme geler au lieu de simplement fournir un événement chronométré. –