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 :

Listbox et Labels Liées


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut Listbox et Labels Liées
    Bonjour à tous,
    Le bout de code ci-après construit 5 Listbox et 5 Labels qui reçoivent chacun le choix de la Listbox correspondante.
    L’idée était d’afficher directement sans valider par le bouton c’est-à-dire au clic dans chaque liste.
    Tkinter renvoie une erreur que je n’arrive pas à contourner.
    Si quelqu’un a une idée, merci d’avance.
    L.PNom : ListBox_Labels.jpg
Affichages : 114
Taille : 17,1 Ko
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    # essai de construction auto de listbox 01
    from tkinter import*
     
    class Listes:
        def __init__(self):
            self.elements = []
     
        def add_element(self, element, name):
            for i, item in enumerate(element):
                name.insert(END, element[i])
     
        def choix_element(self, name): # ne fonctionne pas sans valider par le bouton
            choix_list=name.get(name.curselection())
            print(str(name)[1:], choix_list, str(name)[6:7])
            etiquettes[int(str(name)[6:7])].config(text=choix_list)
     
    def build_et_place_Lbx(fen): # construction et placement de n listbox vides
        global lists
        lists=[]
        for i in range(5):
            list = Listbox(fen, width=8, height=6, name='list[' + str(i) + ']')
            list.place(x= 10 + i * 80, y= 20 )
            lists.append(list)
     
    def build_et_place_Etq(fen): # construction et placement de n Labels vides
        global etiquettes
        etiquettes=[]
        for i in range(5):
            etiquette = Label(fen, text= '........',font=('"Consolas" 8'),)
            etiquette.place(x= 8 + i * 80, y= 120 )
            etiquettes.append(etiquette)
     
    def choix(): # actionné par le bouton pour essai
        for w in lists:
            if w.focus_get()==w:
                f=(str(w)[6:7]) # ne convient que si le nb de listes est <= 10 !
    ##            print(w, f)
        lists[int(f)].bind("<<ListboxSelect>>", li.choix_element(lists[int(f)]))
     
    #---
    fen= Tk()
    fen.geometry ("400x200+1000+600")
    bt=Button(fen, text='choix', command= choix); bt.pack()
    f=0
    lt0=('Azerty', 'Defagu', 'Getidos')
    lt1=('vytum', 'dgbclo', 'vbj45', 'dpoke')
    lt2=(12345, 45678, 12.56, 0.45, -165.125)
    lt3=('fvchux', 'hjbvd', 'fgjion')
    lt4=('',)
     
    ##lt0=()
    ##lt1=()
    ##lt2=()
    ##lt3=()
    ##lt4=()
     
    build_et_place_Lbx(fen)
    build_et_place_Etq(fen)
     
    li=Listes()
    li.add_element(lt0, lists[0])
    li.add_element(lt1, lists[1])
    li.add_element(lt2, lists[2])
    li.add_element(lt3, lists[3])
    li.add_element(lt4, lists[4])
     
    # J’aurai voulu écrire quelque chose comme ça :
    #lists[0].bind("<<ListboxSelect>>", li.choix_element(lists[0])) # ne fonctionne pas ?
     
    fen.mainloop()

  2. #2
    Invité de passage
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 1
    Par défaut
    Hello,

    Ton script est trop complexe pour faire cela, qui peut se résumer en :

    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
    28
    29
    30
    import tkinter as tk
     
    DATA = (
        ('Azerty', 'Defagu', 'Getidos'),
        ('vytum', 'dgbclo', 'vbj45', 'dpoke'),
        (12345, 45678, 12.56, 0.45, -165.125),
        ('fvchux', 'hjbvd', 'fgjion'),
        ('',),
    )
     
    def set_label_value(listbox, label):
        index = listbox.curselection()
        if index:
            label['text'] = listbox.get(index[0])
     
     
    window = tk.Tk()
     
    for i, values in enumerate(DATA):
        listbox = tk.Listbox(window)
        listbox.grid(row=0, column=i)
        listbox.insert(0, *(v for v in values if v))
        label = tk.Label(window)
        label.grid(row=1, column=i)
        listbox.bind(
            '<<ListboxSelect>>',
            lambda evt, lb=listbox, l=label: set_label_value(lb, l)
        )
     
    window.mainloop()
    Il ne faut tout simplement pas oublier de garder une référence locale des objets dans les lambda

  3. #3
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut
    Salut ‘ignifuge’ et merci beaucoup pour cette réponse magistrale.
    Ce petit bout de code est destiné à construire des requêtes avec Postgresql.
    Je n’ai pas tout compris mais je vais me régaler à ‘décortiquer’ cette réponse.
    Encore merci.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par luc pic Voir le message
    Je n’ai pas tout compris mais je vais me régaler à ‘décortiquer’ cette réponse.
    Vous n'avez pas beaucoup progressé depuis la dernière discussion ouverte début mai.

    Vous ne maîtrisez toujours pas les structures de bases, plutôt que de simplifiez le problème vous compliquez les choses à souhait,... du coup on ne peut pas corriger vitre code mais juste tout recommencer.

    La programmation, c'est comme n'importe quelle activité "technique" (bricolage, jardinage, cuisine,...), il faut avoir la patience d'apprendre les bases (acquérir un minimum de savoir faire, maîtriser des outils,...) même si on n'envisage pas de devenir professionnel (i.e. passer un examen genre CAP/BEP/BTS/...)

    A vous de voir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut
    Bonjour à tous et à Ignifuge.
    J’ai ‘disséqué le code exemple et j’ai à peu prés tout compris sauf 2 détails :
    1) If index :
    label[‘text’] = listbox.get(index(0)

    a le même effet que la gestion d’erreur (try : /except
    peut-on utiliser l’un ou l’autre indifféremment ?

    2) listbox.insert(0, *(v for v in values if v))
    est equivalent à listbox.insert(0, * values)

    qu’apporte ce supplément de code ?

    encore merci pour ce coup de main.
    J’ai beaucoup appris en particulier sur l’utilisation des lambda dans ce cas de figure .

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par luc pic Voir le message
    1) If index :
    label[‘text’] = listbox.get(index(0)

    a le même effet que la gestion d’erreur (try : /except
    peut-on utiliser l’un ou l’autre indifféremment ?
    L'évènement '<<ListboxSelect>>' se déclenche lorsque la sélection change. Si on désélectionne, .curselection pourra retourner une liste vide. Si la Listbox est configurée pour accepter des sélections multiples, il y pourra y avoir plus d'un item à traiter...
    S'il y a exception, c'est une façon de coder dans ce cas particulier

    Citation Envoyé par luc pic Voir le message
    2) listbox.insert(0, *(v for v in values if v))
    est equivalent à listbox.insert(0, * values)
    Ca affiche aussi le dernier item et une colonne supplémentaire avec rien dedans...
    Ce n'est donc pas équivalent. Re-vérifiez encore...

    Citation Envoyé par luc pic Voir le message
    J’ai beaucoup appris en particulier sur l’utilisation des lambda dans ce cas de figure .
    ici lambda sert juste à associer une fonction avec 2 widgets en créant une nouvelle fonction et une définition habile de ses paramètres par défault.
    On pourrait le faire avec des closures:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def set_label_value(listbox, label):
        def _callback(event):
            index = listbox.curselection()
            if index:
                label['text'] = listbox.get(index[0])
        return _callback 
     
    for i, values in enumerate(DATA):
     
        ...
        listbox.bind('<<ListboxSelect>>', set_label_value(listbox, label))
    ou avec des class...

    Après la fonction appelée permettant de récupérer la listbox, on n'en a pas besoin:
    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
    def set_label_value(event):
     
        listbox = event.widget
        childs = listbox.master.winfo_children()
        ix = childs.index(listbox)
        label = childs[ix+1]
     
        index = listbox.curselection()
        if index:
            label['text'] = listbox.get(index[0])
     
    for i, values in enumerate(DATA):
     
        listbox = tk.Listbox(window)
        listbox.grid(row=0, column=i)
        listbox.insert(0, *( values))
        label = tk.Label(window)
        label.grid(row=1, column=i)
        listbox.bind('<<ListboxSelect>>', set_label_value)
    et sans connaître les subtilités de Tk pour récupérer la liste des widgets, on peut faire pareil en construisant al sienne..

    note: il y a aussi plein d'exercices corrigés dans les tutos!

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. [XL-2007] Double clic dans listbox --> ouverture hypertexte lié
    Par Aurélien13140 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 29/05/2017, 14h23
  2. Label lié à une combobox1
    Par jofdm dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/01/2013, 16h47
  3. Réponses: 1
    Dernier message: 18/10/2012, 16h01
  4. [VB.NET] [ListBox / ComboBox] Label de l'item sélectionné?
    Par Giuseppe dans le forum Windows Forms
    Réponses: 5
    Dernier message: 14/12/2005, 14h22
  5. [VB.NET] ListBox lié un element a une clé
    Par hirochirak dans le forum Windows Forms
    Réponses: 8
    Dernier message: 03/05/2004, 11h17

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