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 :

récupérer le texte d'un label contenu dans un frame


Sujet :

Tkinter Python

  1. #1
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut récupérer le texte d'un label contenu dans un frame
    bonjour à tous,

    je développe un outil de gestion de pièces administratives à l'ouverture d'un dossier d'inscription.
    Le nombre de pièces etant assez important, les libellés ne tiennent pas sur la ligne d'entête et j'ai dû passer par des abréviations type CI pour carte d'identité.
    On m'a demandé de rajouter des infos bulle sur ces abréviations pour avoir la signification en toute lettres.
    Cette ligne d'entête est contituée de x labels dont les abreviations sont récupérées d'une table SQlite.
    Les ID des labels sont stockés dans un dictionnaire sous la forme :
    dico[ID_label]='abreviation'
    le tout est contenu dans un frame.

    Mon soucis est que je ne parviens pas à récupérer le contenu du texte du label au passage de la souris pour que l'info bulle m'écrive le libéllé en toute lettre. Je ne parviens qu'à pointer sur le frame.

    voici un bout de code: Tkinter+Pmw
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #construit autant de label que de pieces dans list_of_folder
    colonne=0
    for piece in list_of_folder_piece:
    	serial_num=Label(self.label_header_frame,
                           text=piece,anchor='center',
                            bg=self.Guserpref.get('variables widget', 'headerlinecolor'),
                            bd=2, 
                            #width=4)
    	serial_num.grid(row=0, column=colonne+3, sticky=E)
    	self.label_header_frame.columnconfigure(colonne+3, pad=self.__header_pad)
    	#construit un dictionnaire des objet label
    	self.label_header_line_obj[serial_num]=piece
    	colonne+=1
    self.balloon.bind(self.label_header_frame, 'texte des libellés en fonction de l'abreviation')
    merci à tous

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    bonjour,

    Je ne vois pas trop à quoi sert le self.balloon.bind.
    Si j'ai bien compris tu veux récupérer le texte du Label en argument dans une méthode au survol de celui-ci. Il faut donc faire un Bind sur tous les labels. Voici une solution:

    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
     
    #construit autant de label que de pieces dans list_of_folder
    colonne=0
    for piece in list_of_folder_piece:
        serial_num=Label(self.label_header_frame,
        text=piece,anchor='center',
        bg=self.Guserpref.get('variables widget', 'headerlinecolor'),
                            bd=2, 
                            #width=4)
        serial_num.grid(row=0, column=colonne+3, sticky=E)
        self.label_header_frame.columnconfigure(colonne+3, pad=self.__header_pad)
        #construit un dictionnaire des objet label
        self.label_header_line_obj[serial_num]=piece
        colonne+=1
        serial_num.bind("<Enter>", lambda event, x=piece: self.onMotion(event, x))
     
    .....
     
    def onMotion(event, abr):
        print abr

  3. #3
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    bonjour Nyko77 et merci de ta réponse,

    J'ai essayer ton code et cela foncionne trés bien pour la récupération du texte du label. Du coup, je peux maintenant créer un texte du style 'CVi=Carte Vitale'.
    Maintenant, il faut que j'arrive a faire apparaitre un info bulle au passage du pointeur de souris sur les labels en question (d'ou le self.balloon.bind...), qui doit avec Pmw, déclencher une fenêtre balloon.
    Quand j'essaye un code du style:
    self.balloon.bind(serial_num, texte à afficher), rien ne se passe hors mis dans le shell grace au code que tu m'as transmis.
    J'ai l'impression que le pointeur de souris "ne détecte pas" les labels individuellement.
    Une idée ?

  4. #4
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    Bon, petite avancée avec enfin les libellés des labels qui s'affiche en tooltip au passage de la souris dessus.

    voici le code maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    serial_num.bind("<Enter>", lambda event, x=piece: self.onMotion(event, x, label_header_line_obj[x]))
    #avec label_header_line_obj[x]=dictionnaire sous la forme dic[abreviation]=objet label
     
    def onMotion(self, event, abr,  full_ID):
    	libelle=self.db_interface.get_static_datas(abr)  #recupere le libelle en fonction de l'abreviation
    	self.balloon.bind(full_ID,abr+'='+libelle) #full_ID est le numero du widget concerné
    Reste un soucis. Les infos bulles ne s'affiches qu'aprés être passé sur toutes la ligne d'entête contenant tous les label. Ensuite, si on s'arrete sur un label, l'info bulle indique bien le libéllé demandé.
    C'est génant, mais acceptable encore.
    Je tente de trouver un soluce.
    Je suis quant même étonné qu'il faille faire tout cela pour afficher une info bulle, alors que Pmw propose cette option directement.
    Peut être existe t'il un autre moyen plus directe et sans le désagrément du balayage de la ligne pour avoir les infos.

    A suivre
    Merci

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Je viens de regarder le fonctionnement de Balloon, que je ne connaissais pas du tout et en effet il y a une façon bien plus de faire. Il faut d'abord que tu récupères un tuple (ou une liste) sous la forme ((text_label1, info1),(text_label2, info2), ... ), ou avec un système de dictionnaire, ou comme bon te semble. Il faut juste que tu es accès à l'abréviation et au nom complet dans ta boucle for. ensuite il suffit juste de "binder" le balloon. Voici un exemple avec le tuple proposé plus haut.

    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
     
    #construit autant de label que de pieces dans list_of_folder
    colonne=0
    for abr, info in listAbrInfo:
        serial_num=Label(self.label_header_frame,
        text=abr,anchor='center',
        bg=self.Guserpref.get('variables widget', 'headerlinecolor'),
                            bd=2, 
                            #width=4)
        serial_num.grid(row=0, column=colonne+3, sticky=E)
        self.label_header_frame.columnconfigure(colonne+3, pad=self.__header_pad)
        #construit un dictionnaire des objet label
        self.label_header_line_obj[serial_num]=piece
        colonne+=1
        self.balloon.bind(serial_num, info)
    Et voila, le tour est joué, tu n'as pas besoin de méthode supplémentaires.

    p.s:
    Si ton application prend de l'ampleur je te conseil d'utiliser un autre module graphique tel que wxpython ou pyqt, car tkinter est quand même limité.

  6. #6
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    rebonjour nyko77

    je viens de tester ton code, et il fonctionne à merveille. Je n'ai pas construit de liste ou autre conteneur car j'ai ces infos dans un module d'extration de données pour n'avoir aucun code fonctionnel dans le module d'IHM.

    Evidemment, maintenant que la soluce est donnée, elle semble simplissime. Encore faut-il y penser !!

    Un grand merci à toi quand même.

    Pour ce qui est de ton P.S. concernant le GUI. J'en prend bonne note. L'appli touche à sa fin est il ne reste "que quelques fonctionnalités" à coder. Mais j'aurais peut-être du partir sur du wxpython dès le départ en effet.

    Merci encore
    Bringer

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

Discussions similaires

  1. Récupérer le text d'un label situé dans un eventbox
    Par rollbich dans le forum GTK+ avec C & C++
    Réponses: 14
    Dernier message: 03/09/2013, 22h04
  2. Réponses: 10
    Dernier message: 05/02/2008, 14h37
  3. Réponses: 10
    Dernier message: 28/12/2007, 16h58
  4. Réponses: 5
    Dernier message: 05/02/2007, 15h04
  5. Réponses: 8
    Dernier message: 09/07/2006, 14h42

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