2 votes

Python Tkinter Comment utiliser correctement les liaisons?

L'idée était affichée dans la balise où se trouve mon curseur (line.column). Ce qui fonctionne bien avec .index(INSERT) mais si je lie le bouton droit de la souris avec le texte, il renvoie la position du curseur précédent et non pas la position actuelle. Il semble que le rappel soit exécuté après l'événement.

from tkinter import Tk, Text, Frame, Label, StringVar, constants, END, INSERT

EXPL_TEXT = "Je sais que cette robe est du karma. Parfum de regret\nTu me fais réfléchir à"

class App(Frame):
     def __init__(self,master):
        Frame.__init__(self,master)
        self.pack()
        self.var = StringVar()
        self.init_widgets()

    def init_widgets(self):
        self.text = Text(self)
        self.text.bind('',self.callback_index)
        self.text.pack()
        self.text.insert(END,EXPL_TEXT)
        self.label = Label(self, textvariable=self.var)
        self.label.pack()

    def callback_index(self,event):
        x = self.text.index(INSERT)
        self.var.set(x)

if __name__ == '__main__':
    root = Tk()
    app = App(root)
    root.mainloop()

0voto

Mike - SMT Points 9751

Le problème que je crois que vous rencontrez est que lorsque vous cliquez sur votre souris, l'événement se déclenche pour lire INSERT. Le problème est qu'avant de soulever votre souris, l'emplacement aura toujours la valeur du précédent INSERT. Ainsi, pour obtenir la mise à jour après que l'événement soit terminé, nous pouvons utiliser after() pour attendre que l'événement se termine, puis définir la valeur pour self.var.

Modifiez votre méthode callback_index comme suit :

def callback_index(self,event):
    root.after(0, lambda: self.var.set(self.text.index(INSERT)))

Ce que nous faisons est dire à Python de planifier quelque chose pour se produire après un certain temps. Je crois (corrigez-moi si je me trompe) que parce qu'un événement est en cours, il attend que cet événement se termine pour effectuer l'action dans la méthode after().

Nous utilisons lambda pour créer une fonction anonyme afin de mettre à jour votre variable self.var et tout devrait fonctionner comme prévu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X