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 :

Problème sélection d’une ligne dans une fenêtre tkinter. [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juin 2023
    Messages : 3
    Par défaut Problème sélection d’une ligne dans une fenêtre tkinter.
    Bonjour,
    Sous Python 311 j’ai créé une grille dans une fenêtre ’tkinter ‘ à partir des données d’une liste en utilisant une boucle ‘while’.
    En cliquant sur un des boutons à gauche d’une ligne, la ligne sélectionnée est toujours la dernière de la liste ce qui est logique dans la construction utilisée.
    Quelqu’un saurait-il m’indiquer s’il est possible dans cette configuration de sélectionner la ligne correspondant au bouton cliqué (sans passer par un tableau ‘treeview’) ?
    Merci d’avance

    Code python : 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
     
     
    import tkinter as tk
    from tkinter import *
     
    master = tk.Tk()
    master.geometry("800x600+165+0")
    master.config(bg = "#B0C4DE")
     
     
    def enter_widget(event):
        event.widget["bg"] = "yellow"
    def leave_widget(event):
        event.widget["bg"] = "gainsboro"
     
    def affich(a,b,c):
        t2['text']=a['text']
        t3['text']=b['text']
        t1['text']=c['text']
     
    liste = [['1','BAUDELAIRE', 'Charles'],
             ['2','HUGO', 'Victor'],
             ['3','RIMBAUD', 'Arthur'],
             ['4','VILLON','François']]
     
    j=0
    while j<4:
        lb2=tk.Label(master, text=liste[j][1],font=('Tahoma', 9), width="12", bg='white', height="1", bd=2, relief=('ridge'),anchor=CENTER)
        lb2.grid(row=j+1, column=1, padx=1, pady=1)
        lb3=tk.Label(master, text=liste[j][2],font=('Tahoma', 9), width="12", bg='white', height="1", bd=2, relief=('ridge'),anchor=CENTER)
        lb3.grid(row=j+1, column=2, padx=1, pady=1)
        lb1=tk.Button(master, text=liste[j][0],font=('Tahoma', 9), width="4", bg='gainsboro', height="1", bd=2, relief=('raised'),anchor=CENTER,\
                     command=lambda:affich(lb2,lb3,lb1))
        lb1.grid(row=j+1, column=0, padx=1, pady=1)
        lb1.bind("<Enter>", enter_widget)
        lb1.bind("<Leave>", leave_widget)
        j=j+1
     
    b1=tk.Label(master, text='Rang',font=('Tahoma', 9),bg='gainsboro',bd=2, relief=('ridge'),anchor=CENTER)
    b1.place (x=355, y= 5, width=40, height=20)
    t1=tk.Label(master, text='',font=('Tahoma', 9),bg='white',bd=2, relief=('ridge'),anchor=CENTER)
    t1.place (x=355, y= 30, width=40, height=20)
    b2=tk.Label(master, text='NOM',font=('Tahoma', 9),bg='gainsboro',bd=2, relief=('ridge'),anchor=CENTER)
    b2.place (x=400, y= 5, width=100, height=20)
    t2=tk.Label(master, text='',font=('Tahoma', 9),bg='white',bd=2, relief=('ridge'),anchor=CENTER)
    t2.place (x=400, y= 30, width=100, height=20)
    b3=tk.Label(master, text='PRENOM',font=('Tahoma', 9),bg='gainsboro', bd=2, relief=('ridge'),anchor=CENTER)
    b3.place (x=505, y= 5, width=100, height=20)
    t3=tk.Label(master, text='',font=('Tahoma', 9),bg='white',bd=2, relief=('ridge'),anchor=CENTER)
    t3.place (x=505, y= 30, width=100, height=20)
     
    master.mainloop()

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Voici une possibilité en modifiant légèrement ton code :

    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
    import tkinter as tk
    from tkinter import *
     
    master = tk.Tk()
    master.geometry("800x600+165+0")
    master.config(bg="#B0C4DE")
     
     
    def enter_widget(event):
        event.widget["bg"] = "yellow"
     
     
    def leave_widget(event):
        event.widget["bg"] = "gainsboro"
     
     
    def affich(rang):    
        t1['text'] = liste[rang][0]
        t2['text'] = liste[rang][1]
        t3['text'] = liste[rang][2]
     
     
     
    liste = [['1', 'BAUDELAIRE', 'Charles'],
             ['2', 'HUGO', 'Victor'],
             ['3', 'RIMBAUD', 'Arthur'],
             ['4', 'VILLON', 'François']]
     
    j = 0
    while j < 4:
        lb2 = tk.Label(master, text=liste[j][1], font=(
            'Tahoma', 9), width="12", bg='white', height="1", bd=2, relief=('ridge'), anchor=CENTER)
        lb2.grid(row=j+1, column=1, padx=1, pady=1)
        lb3 = tk.Label(master, text=liste[j][2], font=(
            'Tahoma', 9), width="12", bg='white', height="1", bd=2, relief=('ridge'), anchor=CENTER)
        lb3.grid(row=j+1, column=2, padx=1, pady=1)
        lb1 = tk.Button(master, text=liste[j][0], font=('Tahoma', 9), width="4", bg='gainsboro', height="1", bd=2, relief=('raised'), anchor=CENTER,
                        command=lambda rang=j: affich(rang))
     
        lb1.grid(row=j+1, column=0, padx=1, pady=1)
        lb1.bind("<Enter>", enter_widget)
        lb1.bind("<Leave>", leave_widget)
        j = j+1
     
    b1 = tk.Label(master, text='Rang', font=('Tahoma', 9),
                  bg='gainsboro', bd=2, relief=('ridge'), anchor=CENTER)
    b1.place(x=355, y=5, width=40, height=20)
    t1 = tk.Label(master, text='', font=('Tahoma', 9), bg='white',
                  bd=2, relief=('ridge'), anchor=CENTER)
    t1.place(x=355, y=30, width=40, height=20)
    b2 = tk.Label(master, text='NOM', font=('Tahoma', 9),
                  bg='gainsboro', bd=2, relief=('ridge'), anchor=CENTER)
    b2.place(x=400, y=5, width=100, height=20)
    t2 = tk.Label(master, text='', font=('Tahoma', 9), bg='white',
                  bd=2, relief=('ridge'), anchor=CENTER)
    t2.place(x=400, y=30, width=100, height=20)
    b3 = tk.Label(master, text='PRENOM', font=('Tahoma', 9),
                  bg='gainsboro', bd=2, relief=('ridge'), anchor=CENTER)
    b3.place(x=505, y=5, width=100, height=20)
    t3 = tk.Label(master, text='', font=('Tahoma', 9), bg='white',
                  bd=2, relief=('ridge'), anchor=CENTER)
    t3.place(x=505, y=30, width=100, height=20)
     
    master.mainloop()

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par la murène 38 Voir le message
    Quelqu’un saurait-il m’indiquer s’il est possible dans cette configuration de sélectionner la ligne correspondant au bouton cliqué?
    Il faut apprendre à utiliser "lambda".
    Si j'écris: f = lambda: print(i) d'où sort la variable i qui sera à récupérer lorsque la fonction f sera exécutée?
    Sur ma machine, on aura un beau message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> f()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 1, in <lambda>
    NameError: name 'i' is not defined. Did you mean: 'id'?
    >>>
    qui montre que ça cherche à récupérer l'objet associé à la variable i. Et si ce i est l'indice d'une boucle, on récupèrera toujours la dernière valeur définie.
    L'astuce pour associer chaque fonction créé aux variables correspondantes sera de les figer dans les paramètres par défaut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> i = 999
    >>> f = lambda i = i: print(i)
    >>> f()
    999
    Et si on modifie la variable, ça fonctionne encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> i = 0
    >>> f()
    999
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juin 2023
    Messages : 3
    Par défaut Problème sélection d’une ligne dans une fenêtre tkinter
    Merci beaucoup BEGINNER de m'avoir résolu de problème.
    La modification que tu as apportée à mon code marche super .
    Merci également à WIZTRICKS; effectivement je faisais une mauvaise utilisation du "lambda".
    Bonne journée à tous.

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while j<4:
        ...
        j=j+1
    Clairement pas du code "style python"

    Pourquoi ne pas faire une boucle for sur la variable liste (avec enumerate() si besoin) ...


    Ou alors, à minimum : while j < len(liste):

  6. #6
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juin 2023
    Messages : 3
    Par défaut
    Bonjour Papakoker,
    Merci de ta remarque.
    Mon code est encore influencé par l'habitude d'utiliser msaccess.

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

Discussions similaires

  1. [AC-2013] Problème de sélection de ligne dans une combobox
    Par appadawan dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/07/2015, 15h39
  2. [Forum] Aller à la ligne dans une fenêtre d'information Google Map
    Par guigui5931 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 31/10/2007, 12h27
  3. Sélection de ligne dans une DataTable
    Par ruda.tom dans le forum JSF
    Réponses: 9
    Dernier message: 09/03/2007, 21h07
  4. Réponses: 5
    Dernier message: 08/08/2006, 02h22
  5. Sélection de lignes dans une feuille Excel
    Par lerico dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/12/2005, 09h20

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