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 :

connaitre le widget entry actif


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Points : 56
    Points
    56
    Par défaut connaitre le widget entry actif
    Bonsoir,
    désolé de demander des explications certainement basique pour vous, mais je n'arrive pas à trouver sur le forum ou je ne comprends pas !

    je désire connaitre la zone de texte sélectionnée par la souris, en sachant que les 'entry' sont créés avec un tableau de variables.

    je vous mets un bout de code qui représente ce que je veux faire.

    merci de votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import tkinter as Tk
     
    class root(Tk.Tk):
        def __init__(self):
            Tk.Tk.__init__(self)
     
            self.nbr_entry=5; ligne=0
            self.saisie=[0]*self.nbr_entry
            for i in range(self.nbr_entry):
                ligne=i
                self.saisie[i]=Tk.Entry (self,width=20)
                self.saisie[i].grid(row=ligne,column=0,padx=10,pady=10)
            self.eti=Tk.Label(self,width=20,text='saisie sélectionné')
            self.eti.grid(row=ligne+1,column=0)
     
        def savoir_index(self,event):
            self.eti.configure(text='zone de saisie n°')
     
    feuille=root()
    if __name__ == '__main__':
        for i in range(feuille.nbr_entry):
            feuille.saisie[i].bind('<ButtonRelease-1>',feuille.savoir_index)
        feuille.mainloop()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 347
    Points : 36 870
    Points
    36 870
    Par défaut
    Salut,

    Dans "event" reçu en paramètre par "savoir_index", l'attribut "widget" contient une des "Entry" sur laquelle a été fait .bind...

    La liste saisie contenant ces "widgets", il suffit d'en récupérer l'index:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def savoir_index(self,event):
            w = event.widget
            if w in self.saisie:
                  index = self.saisie.index(w)
                  self.eti.configure(text='zone de saisie n° %d' % index)
    - W

  3. #3
    Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    merci beaucoup wiztricks, cela faisait un moment que je tournais autour

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    La solution de wiztricks répond parfaitement à la question mais je me permets juste une information de plus pour le PO.
    Voici un code qui via le Widget qui a déclencher l'event (wiztricks vous en donne l'exemple) en récupère le nom.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import tkinter as Tk
     
     
    class root(Tk.Tk):
        def __init__(self):
            Tk.Tk.__init__(self)
            self.nbr_entry = 5
            self.saisie = [0]*self.nbr_entry
            for ligne in range(self.nbr_entry):
                self.saisie[ligne]=Tk.Entry (self, width=20, name=str(ligne))
                self.saisie[ligne].grid(row=ligne, column=0, padx=10, pady=10)
                self.saisie[ligne].bind('<ButtonRelease-1>', self.savoir_index)
            self.eti = Tk.Label(self, width=20, text='saisie sélectionné')
            self.eti.grid(row=ligne+1, column=0)
     
        def savoir_index(self,event):
            self.eti.configure(text='zone de saisie n° %s' % event.widget._name)
     
     
    if __name__ == '__main__':
        feuille = root()
        feuille.mainloop()
    Presque inutile ici puisque vous travaillez sur un index mais pas sans intérêt si le nom correspond à une clé dans un dico (ou tout autre objet)

    @+

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 347
    Points : 36 870
    Points
    36 870
    Par défaut
    Salut,

    Merci PauseKawa: on ne fera jamais assez de pub sur le nommage hiérarchique de Tk. Mais sur le fond, pour récupérer le widget qui a le focus, .focus_get sera préférable.

    Avec le reflexe de coller une textvariable aux "Entry" utilisées pour la saisie, je ne vois pas l'intérêt de cette relation entre index et entry.

    Cela "présente" des "valeurs à modifier" mais le reste du prog. est plutôt intéressé par la "valeur actuelle" plutôt que par l'index du widget qui sert d'interface.

    - W

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour wiztricks,

    Citation Envoyé par wiztricks Voir le message
    Mais sur le fond, pour récupérer le widget qui a le focus, .focus_get sera préférable.
    En fait je n'ai pas bien compris ce passage
    Puisque nous avons ici une instance d'Event nous avons déjà l'information dans celle-ci (event.widget).
    Pour le PO:
    Tkinter.py
    """Container for the properties of an event.

    Instances of this type are generated if one of the following events occurs:

    KeyPress, KeyRelease - for keyboard events
    ButtonPress, ButtonRelease, Motion, Enter, Leave, MouseWheel - for mouse events
    Visibility, Unmap, Map, Expose, FocusIn, FocusOut, Circulate,
    Colormap, Gravity, Reparent, Property, Destroy, Activate,
    Deactivate - for window events.

    If a callback function for one of these events is registered
    using bind, bind_all, bind_class, or tag_bind, the callback is
    called with an Event as first argument. It will have the
    following attributes (in braces are the event types for which
    the attribute is valid):

    serial - serial number of event
    num - mouse button pressed (ButtonPress, ButtonRelease)
    focus - whether the window has the focus (Enter, Leave)
    height - height of the exposed window (Configure, Expose)
    width - width of the exposed window (Configure, Expose)
    keycode - keycode of the pressed key (KeyPress, KeyRelease)
    state - state of the event as a number (ButtonPress, ButtonRelease,
    Enter, KeyPress, KeyRelease,
    Leave, Motion)
    state - state as a string (Visibility)
    time - when the event occurred
    x - x-position of the mouse
    y - y-position of the mouse
    x_root - x-position of the mouse on the screen
    (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
    y_root - y-position of the mouse on the screen
    (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
    char - pressed character (KeyPress, KeyRelease)
    send_event - see X/Windows documentation
    keysym - keysym of the event as a string (KeyPress, KeyRelease)
    keysym_num - keysym of the event as a number (KeyPress, KeyRelease)
    type - type of the event as a number
    widget - widget in which the event occurred
    delta - delta of wheel movement (MouseWheel)
    """
    Il est vrais que _name est signalé comme interne mais j'ai trouver intéressant de le signaler dans le sens ou il peut aussi être, par exemple, une clé de dico ou dans une base de donnée. Cela simplifie drôlement le code puisque du coup la liaison _name > objet est directe.
    Cela évite de tester un index, qui nous importe peut en fait, pour retrouver ce que nous cherchons vraiment. Sauf si l'index correspond a l'index d'un autre objet (w[x] pour l[x]) de même taille.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 347
    Points : 36 870
    Points
    36 870
    Par défaut montres moi MVC
    Salut,

    Citation Envoyé par PauseKawa
    Citation Envoyé par wiztricks
    Mais sur le fond, pour récupérer le widget qui a le focus, .focus_get sera préférable.
    En fait je n'ai pas bien compris ce passage
    Par défaut, <1> change le focus et le widget qui a le focus est retourné par .focus_get. Pas besoin de suivre son changement "à la volée" puisqu'on sait qui il est 'à la demande'.

    Il est vrais que _name est signalé comme interne mais j'ai trouver intéressant de le signaler dans le sens ou il peut aussi être, par exemple, une clé de dico ou dans une base de donnée. Cela simplifie drôlement le code puisque du coup la liaison _name > objet est directe.
    hmm...
    C'est une autre approche au sens ou plutôt que de calculer .index du widget dans la liste on encode l'index dans l'objet d'une façon ou d'une autre.
    Mais plutôt que de cannibaliser des variables "privées" pourquoi ne pas créer "sa" variable et faire disparaître la liste...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           for ligne in range(count):
                e = Tk.Entry (self, width=20)
                e.ligne = ligne
    Note: ._name n'a de sens que lorsqu'on connaît le "parent" puisque c'est la clé du dict .children. Et si on veut que cet identifiant soit "utilisable", il faudra le "construire" plutôt que de laisser faire tkinter.

    Juste pour le fun.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import tkinter as tk
     
    def create_entries(master, items, state='normal', **kwds):
        frame = tk.Frame(master, **kwds)
        for ix, (k, v) in enumerate(items):
            tk.Label(frame, text=k).grid(row=ix, column=0)
            e = tk.Entry(frame, textvariable=v, state=state)
            e.grid(row=ix, column=1)
        return frame
     
    root = tk.Tk()
     
    my_vars = { c :  tk.IntVar() for c in 'AB' }
    result = { '=' :  tk.IntVar() }
     
    create_entries(root, my_vars.items(), bd=2, relief='sunken').pack(side='top')   
    frame = create_entries(root, result.items(), bd=2, relief='sunken', state='readonly')
    frame.pack(side='top')   
     
    def update_R():
        print ('do_op')
        p = my_vars['A'].get() + my_vars['B'].get()
        result['='].set(p)
     
    frame.bind('<FocusIn>', lambda e: update_R())
     
    root.mainloop()


    - W

  8. #8
    Membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Février 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : débutant
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2012
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    merci à tous pour votre aide.

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

Discussions similaires

  1. Probleme widget Entry
    Par vincent.mbg dans le forum Tkinter
    Réponses: 2
    Dernier message: 28/02/2008, 15h41
  2. Augmenter la hauteur d'un widget Entry
    Par xEndLe dans le forum Tkinter
    Réponses: 5
    Dernier message: 14/05/2007, 13h40
  3. [pERl TK] Obtenir le texte sélectionné d'un widget entry
    Par dreydrey dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 18/01/2007, 09h18
  4. [Perl/Tk] widget Entry ou équivalent ?
    Par Mr6 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 13/04/2006, 07h34
  5. [Tkinter] ecrire un texte dans un widget entry
    Par thierry_b dans le forum Tkinter
    Réponses: 3
    Dernier message: 15/12/2005, 11h38

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