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 :

Lier treeview a une liste d'objets


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Lier treeview a une liste d'objets
    Bonjour,

    Voila je suis en train de creer un petit programme qui genere une liste de personnages avec certaines caracteristiques.
    J'aimerais pouvoir acceder a chacun de ces personnages depuis une liste creee avec Tkinter.

    Jusqu'ici voila mon code pour le GUI:

    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
    class CTABLE:
        def __init__(self, master):
     
            self.charactersTable = ttk.Treeview(master, selectmode="browse")
            self.charactersTable["show"] = "headings"
            self.charactersTable["columns"]=("Name", "Surname", "Hunger",
                "Fear", "Comfort", "Hapiness")
            self.charactersTable.column("Name", width=100, anchor=E)
            self.charactersTable.heading("Name", text="Name")
            self.charactersTable.column("Surname", width=100, anchor=E)
            self.charactersTable.heading("Surname", text="Surname")
            self.charactersTable.column("Hunger", width=100, anchor=E)
            self.charactersTable.heading("Hunger", text="Hunger")
            self.charactersTable.column("Fear", width=100, anchor=E)
            self.charactersTable.heading("Fear", text="Fear")
            self.charactersTable.column("Comfort", width=100, anchor=E)
            self.charactersTable.heading("Comfort", text="Comfort")
            self.charactersTable.column("Hapiness", width=100, anchor=E)
            self.charactersTable.heading("Hapiness", text="Hapiness")
            for character in characters:
                self.charactersTable.insert("", "end", values=(character.surname, character.name, 
                character.hunger, character.fear, character.comfort,
                character.happiness))
            self.charactersTable.bind("<Double-1>", self.CTClick)
            self.charactersTable.grid(row=1, rowspan=3, column=1)
     
        def CTClick(self, event):
    		item = self.charactersTable.selection()[0]
    		print (self.charactersTable.item(item))
    Chacun de mes personnages a beaucoup plus de stats que celles qui sont presentes dans ma liste Tkinter.
    Je voudrais que lorsque je click sur une des lignes du tableau le programme affiche la fiche du personnage selectionne avec toutes ses stats (dans une autre fenetre ou peu importe)
    Pour le moment mon programme n'affiche que les elements deja presents dans la liste...

    Voila un exemple de ce que je voudrais obtenir:

    Nom : ck2-guide-52-marriage-acquisition-1.jpg
Affichages : 2021
Taille : 332,8 Ko

    Sur le droite vous avez la liste des personnages avec certaines de leurs stats et a gauche la fiche detaillee du personnage selectionne.

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Quel est le retour de print (self.charactersTable.item(item)) ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Pour le moment j'obtiens ca lorsque je clique sur un personnage:

    Nom : sample.jpg
Affichages : 2726
Taille : 117,7 Ko

    Le programme me retourne la valeur de la ligne selectionnee.
    Je voudrais qu'au lieu de ca il me retourne l'objet "character" lui meme (pour pouvoir avoir acces a toutes ses stats etc...)

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    C'est le texte dans le terminal qui nous intéresse ici.

    Il semble qu'il t'indique que c'est l'élément 3 et dans ta liste de personnages tu sais où se trouve celui-ci, non ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Haaa, je vois! Mais alors autre question, si je change l'ordre de mon tableau (par exemple en permettant a l'utilisateur de l'ordonner par ordre alphabetique ou autre est ce que ca ne va pas tout fausser?

    Desole si ces questions paraissent idiotes mais je n'ai pas l'habitude de travailler avex un gui

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Et si tu fais comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        def CTClick(self, event):
    		item = self.charactersTable.selection()[0]
    		print (self.charactersTable.item(item.values))
    il en sort quoi ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Gobhniu Voir le message
    Haaa, je vois! Mais alors autre question, si je change l'ordre de mon tableau (par exemple en permettant a l'utilisateur de l'ordonner par ordre alphabetique ou autre est ce que ca ne va pas tout fausser?
    Lorsque vous effectuez un .insert, çà va retourner un identifiant qui sera attribué à la ligne quelque soit sa 'position'.
    C'est cet identifiant qui sera retourné par treeview.selection() - la chose de la forme I00n' -.
    Pour associer l'objet à un tel identifiant, il suffit d'utiliser un dict.

    Ci dessous un exemple de treeview qui affiche 3 items et qui bouge l'item sélectionné en "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
    16
    17
    18
    19
    20
    21
    22
    23
    import tkinter.ttk as ttk
     
    COLUMNS = ('one', 'two')
    tv = ttk.Treeview()
    tv['columns'] = COLUMNS
     
    for ix, s in enumerate(COLUMNS):
        tv.column(s, width=50)
        tv.heading(s, text=chr(ord('A') + ix))
     
    for z in range(3):
        ident = tv.insert('', 'end', text='line-%d' % z, values=('%dA' % z, '%dB' % z))
        print (ident)
     
    def foo(e):
        ident = tv.selection()
        print ('foo', ident, tv.index(ident))
        tv.move(ident, '', 0)
     
    tv.bind('<<TreeviewSelect>>', foo)
    tv.pack()
     
    tv.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Candidat au Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour ton aide! Ca faisait 3 jours que j'essayais de resoudre ca

  9. #9
    Candidat au Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Alors j'ai un nouveau probleme en faite....

    Voila ce que ca donne si je click sur chaque ligne de mon tableau une apres l'autre:

    Nom : sample.jpg
Affichages : 2179
Taille : 115,8 Ko

    Vous pouvez voir la console derriere, Python attribue un numero a chaque ligne normalement mais apres 9 il commence a donner des lettres comme id.
    Il fait ca pour quelques lignes et reviens ensuite a 10....

    Y a t'il un moyen de corriger ca? est-ce que je peux attribuer un numero a chaque ligne manuellement?

  10. #10
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    C'est en hexadécimal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >>> int('a', 16)
    10
    >>> int('b', 16)
    11
    ...

  11. #11
    Candidat au Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2015
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Gobhniu Voir le message
    Vous pouvez voir la console derriere, Python attribue un numero a chaque ligne normalement mais apres 9 il commence a donner des lettres comme id.
    Il fait ca pour quelques lignes et reviens ensuite a 10....
    Ce n'est pas un numéro de ligne mais l'identifiant assigné par défaut à la chose - que treeview appelle item - créée lors de l'insert - on peut insérer ailleurs qu'a la dernière ligne...-. Pour TCL, c'est une chaîne de caractère. C'est pour çà qu'elle commence par une lettre, ici 'I'. Normalement, il est "opaque": vous ne devriez pas regarder sa forme pour en déduire quoi que ce soit.
    Si vous voulez récupérer le numéro de ligne correspondant, il faut faire .index(identifiant).

    Mais étudiez un peu l'exemple que je vous ai donné et regardez ce qu'il affiche lors d'un selection():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def foo(e):
        ident = tv.selection()
        print ('foo', ident, tv.index(ident))
        tv.move(ident, '', 0)
    1. récupération de l'ident de l'item sélectionné,
    2. affichage de l'ident et du numéro de ligne correspondant,
    3. déplacement de l'item à la ligne 0.


    La documentation est ici. C'est un peu technique, certes, mais rien ne vous empêche de voir comment çà fonctionne sur de petits exemples avant d'essayer d'utiliser cela dans votre code. Vous y trouverez comment définir vos propres identifiants si nécessaire.

    - 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. [JCombobox] Lier à une liste d'objets
    Par PhildarZ dans le forum Composants
    Réponses: 6
    Dernier message: 06/07/2008, 19h24
  2. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11
  3. methode qui retourne une liste d'objets du meme type
    Par anoukhan dans le forum Oracle
    Réponses: 8
    Dernier message: 12/01/2006, 18h38
  4. Tri d'une liste d'objet CObList
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 13/07/2005, 13h50
  5. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11

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