IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Détection de position du curseur dans un widget text quand on clique


Sujet :

Tkinter Python

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut Détection de position du curseur dans un widget text quand on clique
    Bonjour, j'ai un widget text auquel j'applique un bind <Button1>. La fonction associée au bind me renvoie la position du curseur dans le widget text quand je clique sans relacher.

    Si dans la fonction j'utilise le marqueur INSERT:
    Alors la fonction me renvoie la position du curseur d'insertion qu'il y avait avant le click. Pourtant au click, le curseur a été déplacé (je le vois) avant que je relache le bouton de la souris

    Du coup, j'utilise le marqueur CURRENT:
    Là, la position du curseur est la bonne, ou presque. En effet, suivant que je clique un peu plus à droite ou à gauche du caractère ou parfaitement entre deux lettres, la position CURRENT est la même ou celle d'à coté de celle de INSERT. En fait, ici cela ne convient que si le caractère cliqué (CURRENT) est à la position équivalente à celle du curseur INSERT.

    Si je fais un binding ButtonRelease, cela marche très bien avec le marqueur INSERT, mais moi je voudrais utiliser le Button, sans relacher la souris!!!!

    Je souhaiterai donc savoir comment récupérer à l'avance la position de INSERT, c'est à dire avant de relacher le bouton de la souris.

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def onClik(self,event):
        self.Mytext.index('@%d,%d' %(event.x, event.y))

  3. #3
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Bonjour, merci pour le code mais malheureusement, il donne exactement le même problème que si j'utilise index(CURRENT).

    Pour expliquer:
    Disons que mon Tkinter text contient ce string: "merci".

    -Si je clique pile poil entre le "m" et le "e", alors cela fonctionne car CURRENT sera égal à INSERT (= "1.1").
    -Si maintenant je clique sur le "e", si mon click se fait sur la moitié gauche du "e", cela marche encore, mais si le click se fait sur la moitié droite du "e", alors CURRENT sera = à "1.1" (ce qui est d'index du "e") mais INSERT sera = à "1.2" car le caret d'insertion sera après le "e" du fait que mon click était plus sur la droite du "e".

    Donc mon problème est soit de pouvoir détecter la position du caret d'insertion avant de relacher le bouton de la souris (on le voit se déplacer avant de relâcher donc je pense que cela devrait etre possible), sois je pensais que si on peut simuler un click avec une commande, je peux simuler le click/release dans ma fonction onclick ce qui me permet de détecter la nouvelle position du caret avant de relâcher le bouton de la souris.
    Bien entendu, je suis ouvert à toute suggestion.

    Merci encore si vous avez une idée pour m'aider.

  4. #4
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def onClik(self,event):
        print self.myText.index(INSERT)
        self.Mytext.after_idle(self.releaseButton)
     
    def releaseButton(self):
        self.myText.generate_event('<ButtonRelease-1>')
        print self.myText.index(INSERT)

  5. #5
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Salut, le code ne fonctionne pas car il y a une erreur de type: has no attribute "generate_event". Voici plus de détails si ça peut aider:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
        return self.func(*args)
      File "C:\essai.py", line 9, in releaseButton
        root.generate_event("<ButtonRelease-1>")
      File "C:\Python25\lib\lib-tk\Tkinter.py", line 1721, in __getattr__
        return getattr(self.tk, attr)
    AttributeError: generate_event
    Est ce que "generate_event" fait partie d'un package que je n'ai pas importé dans mon fichier? Cela pourrait être une raison, sinon je ne vois pas. Avez vous une documentation quelque part qui parle de generate_event. En effet, je n'ai rien trouvé de tel dans mes docs, mais je serais très intéressé d'avoir une documentation plus complète sur python et Tkinter que ce que j'ai actuellement.

    PS: j'ai essayé le "generate_event" sur un Tk, un Tk.text, un TopLevel et j'ai toujours le même type d'erreur.

  6. #6
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Merci de m'avoir mis sur la voie, j'ai trouvé...

    Il suffit d'utiliser le after_idle sur une fonction qui donne l'index de INSERT, ceci appelé lors du click (<Button-1>). Dans ce cas, la valeur renvoyée sera la bonne, autrement dit celle qui correspondra à celle renvoyée quand on relâche le bouton de la souris (<ButtonRelease-1>):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        self.mytext.bind("<Button-1>", deb_sel)
     
        def deb_sel(self, event):
            def insert_detect():
                self.index(INSERT)
                #... faire ici ce que l'on veut de l'index
            self.after_idle(insert_detect)
    PS : je suis toujours interessé par une doc complète de python / Tkinter.

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour la doc de tkinter: http://infohost.nmt.edu/tcc/help/lan...on/tkinter.pdf

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Désolé, j'aurais du me relire...
    Ce n'est pas "generate_event", mais "event_generate"...

  9. #9
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 91
    Points
    91
    Par défaut
    Merci pour la correction, en effet je me demandais pourquoi je ne trouvais rien sur la commande generate_event nulle part, pas même sur le web.
    Finalement, en utilisant juste le after_idle, cela fonctionne très bien mais je n'aurai jamais trouvé sans vous, donc merci encore.

    Merci à tyrtamos pour la doc. En fait j'avais déjà la même et je me demandais si il y avait quelque chose de plus complet car je n'avais pas trouvé de generate_event, qui est en fait fait event_generate. Il semble donc que non et je vais continuer avec cela.

    C'est un plaisir d'apprendre le Python, alors même que c'est en rentrant le soir après le boulot, et ce grace à votre aide!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. position du curseur dans widget text
    Par aoumnad dans le forum Tkinter
    Réponses: 7
    Dernier message: 27/02/2013, 21h08
  2. déplacer le curseur dans un widget text
    Par vincent.mbg dans le forum Tkinter
    Réponses: 5
    Dernier message: 19/08/2009, 12h33
  3. couleur du curseur dans un widget text Tk
    Par thieduvar dans le forum Tkinter
    Réponses: 1
    Dernier message: 08/07/2007, 22h39
  4. [VB6] position du curseur dans une zone texte et insertion caractere
    Par tim69000 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/05/2006, 09h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo