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 :

Lister un tableau


Sujet :

Tkinter Python

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut Lister un tableau
    Bonjour,

    j'ai un canvas composé de rectangles contenant chacun une valeur booléenne (ici VRAI ou FAUX).

    exemple :

    VRAI - FAUX - VRAI - FAUX
    VRAI - FAUX - VRAI - FAUX
    VRAI - FAUX - VRAI - FAUX
    FAUX - FAUX - VRAI - FAUX
    Je voudrai récupérer les valeurs des lignes ou des colonnes sous forme de listes.

    exemple par ligne :

    [[VRAI, FAUX, VRAI, FAUX], [VRAI, FAUX, VRAI, FAUX],[VRAI, FAUX, VRAI, FAUX],[FAUX, FAUX, VRAI, FAUX]]
    exemple par colonne :

    [[VRAI, VRAI, VRAI, FAUX], [FAUX, FAUX, FAUX, FAUX],[VRAI, VRAI, VRAI, VRAI],[FAUX, FAUX, FAUX, FAUX]]
    J'ai donc écrit le code suivant :

    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
    def Listage(evt) :
       listeMatrice[:]=[]
       listeMatrice2=[]
       myLenght = int(len(items2))
       for x in range(0,myLenght):
         #listeMatrice.append(listeMatrice2)
         listeMatrice2[:]=[]
         for y in range(0,myLenght):
           myT = can.itemcget(items2[x][y],'text')
           print(" x = "+str(x)+" et y = "+str(y)+" = "+str(myT))
           myT2 = " x = "+str(x)+" et y = "+str(y)+" = "+str(myT)
           listeMatrice2.append(myT2)
           if y==myLenght-1:
              listeMatrice.append(listeMatrice2)
     
       print(listeMatrice)

    et j'obtiens le résultat suivant :

    x = 0 et y = 0 = VRAI
    x = 0 et y = 1 = FAUX
    x = 0 et y = 2 = VRAI
    x = 0 et y = 3 = FAUX
    x = 1 et y = 0 = VRAI
    x = 1 et y = 1 = FAUX
    x = 1 et y = 2 = VRAI
    x = 1 et y = 3 = FAUX
    x = 2 et y = 0 = VRAI
    x = 2 et y = 1 = FAUX
    x = 2 et y = 2 = VRAI
    x = 2 et y = 3 = FAUX
    x = 3 et y = 0 = FAUX
    x = 3 et y = 1 = FAUX
    x = 3 et y = 2 = VRAI
    x = 3 et y = 3 = FAUX



    [[' x = 3 et y = 0 = FAUX', ' x = 3 et y = 1 = FAUX', ' x = 3 et y = 2 = VRAI', ' x = 3 et y = 3 = FAUX'], [' x = 3 et y = 0 = FAUX', ' x = 3 et y = 1 = FAUX', ' x = 3 et y = 2 = VRAI', ' x = 3 et y = 3 = FAUX'], [' x = 3 et y = 0 = FAUX', ' x = 3 et y = 1 = FAUX', ' x = 3 et y = 2 = VRAI', ' x = 3 et y = 3 = FAUX'], [' x = 3 et y = 0 = FAUX', ' x = 3 et y = 1 = FAUX', ' x = 3 et y = 2 = VRAI', ' x = 3 et y = 3 = FAUX']]

    la 1ère ligne donne :

    [FAUX, FAUX, VRAI, FAUX]
    Pourriez-vous me dire, svp, comment faire pour avoir le bon résultat qui est :

    [VRAI, FAUX, VRAI, FAUX]
    Merci de votre aide,
    Cordialement,
    Arsène

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

    Citation Envoyé par Arsene12 Voir le message
    Je voudrai récupérer les valeurs des lignes ou des colonnes sous forme de listes.
    Si vous voulez créer une liste par ligne afin d'obtenir une liste de listes, il faut accumuler le contenu d'une ligne dans une liste et faire un append de cette liste (plutôt qu'un .append de chaque élément).

    Citation Envoyé par Arsene12 Voir le message
    Pourriez-vous me dire, svp, comment faire pour avoir le bon résultat qui est :
    Dans les coordonnées (x, y) d'un point du Canvas, est ce que c'est "x" qui représente la ligne?

    - W

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Merci beaucoup. J'ai changé le code en tenant compte de votre remarque et maintenant ça marche :

    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
    def listage(evt) :
         listeMatrice[:]=[]
       myT0 = 0
       myT = 0
       myLenght = int(len(items2))
       for x in range(0,myLenght):
         myT0 = 0
         for y in range(0,myLenght):
           myT = can.itemcget(items2[x][y],'text')       
           if myT0 ==0:
              myT0 = str(myT)
           else: 
              myT0 = str(myT0)+", "+str(myT)
              if y == myLenght-1:
                print(myT0)
                listeMatrice.append(myT0)
       print(listeMatrice)

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    Merci beaucoup. J'ai changé le code en tenant compte de votre remarque et maintenant ça marche mieux:

    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
    def listage(evt) :
         listeMatrice[:]=[]
       myT0 = 0
       myT = 0
       myLenght = int(len(items2))
       for x in range(0,myLenght):
         myT0 = 0
         for y in range(0,myLenght):
           myT = can.itemcget(items2[x][y],'text')       
           if myT0 ==0:
              myT0 = str(myT)
           else: 
              myT0 = str(myT0)+", "+str(myT)
              if y == myLenght-1:
                print(myT0)
                listeMatrice.append(myT0)
       print(listeMatrice)

    mais il reste un problème : les listes sont notés comme des éléments :

    ['VRAI, VRAI, FAUX, FAUX, VRAI, FAUX, FAUX, VRAI, FAUX, VRAI, FAUX, VRAI, FAUX, FAUX, FAUX, VRAI, FAUX, FAUX, FAUX, VRAI',....
    au lieu de :
    [(VRAI, VRAI, FAUX, FAUX, VRAI, FAUX, FAUX, VRAI, FAUX, VRAI, FAUX, VRAI, FAUX, FAUX, FAUX, VRAI, FAUX, FAUX, FAUX, VRAI),....

    Pour avoir qu'une seule liste, le code est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def listage(evt) :
       listeMatriceM[:]=[]
       myT = 0
       myLenght = int(len(items2))
       for x in range(0,myLenght):
            for y in range(0,myLenght):
                  myT = can.itemcget(items2[x][y],'text')       
                  listeMatriceM.append(myT)         
       print(listeMatriceM)

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    J'ai trouvé la 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
    21
    def listage(evt) :
       listeMatrice[:]=[]
       myT0 = 0
       myT = 0
       myLenght = int(len(items2))
       for x in range(0,myLenght):
         if myT ==0 :
            pass
         else:
            listeMatrice.append([myT0])
     
         myT0 = 0
         for y in range(0,myLenght):
           myT = can.itemcget(items2[x][y],'text')       
           if myT0 ==0:
              myT0 = str(myT)
           else: 
              myT0 = str(myT0)+", "+str(myT)
     
       listeMatrice.append([myT0])       
       print(listeMatrice)
    Pour que l'élément ajouté soit pris en compte en tant que liste, il faut rajouter des crochets.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    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 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    Pour que l'élément ajouté soit pris en compte en tant que liste, il faut rajouter des crochets.
    Et pour jouer avec des listes de listes, il faut prendre le temps d'ouvrir un tuto. pour apprendre à les manipuler... Ce qui évite de passer un temps fou à tâtonner pour écrire un code illisible (et que pas grand monde ira corriger).

    - W

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Veuillez m'excusez. Mettre des crochets ne change rien. Il y a toujours l'apostrophe qui s'insère et qui transforme la liste en un seul élément (une chaine de caractère)


    J'aimerai qu'on m'explique :

    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
    def listage() :
       listeMatrice[:]=[]
       listeMatriceM[:]=[]
       myT0 = 0
       myT = 0
       myLenght = int(len(items2))
       for x in range(0,myLenght):
         listeMatrice.append(listeMatriceM)
         print(listeMatriceM)
         listeMatriceM[:]=[]
         myT0 = 0
         for y in range(0,myLenght):
           myT = can.itemcget(items2[x][y],'text')       
           listeMatriceM.append(myT) 
     
       listeMatrice.append(listeMatriceM)       
       print(listeMatrice)
       print("LISTE : "+str(listeMatrice[0:1]))
    le print(listeMatriceM) me donne ceci :

    ['FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'VRAI', 'FAUX', 'VRAI', 'FAUX']
    ['FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'VRAI', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'VRAI', 'FAUX', 'VRAI']
    ['VRAI', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'FAUX', 'VRAI']
    ['FAUX', 'VRAI', 'FAUX', 'VRAI', 'FAUX', 'VRAI', 'VRAI', 'VRAI', 'VRAI', 'VRAI', 'VRAI', 'VRAI', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'VRAI']
    ['VRAI', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'FAUX', 'VRAI', 'VRAI', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'VRAI', 'FAUX', 'VRAI']
    et le listeMatrice.append(listeMatriceM) me donne cela :


    [['FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'VRAI'],
    ['FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'VRAI'],
    ['FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'VRAI'],
    ['FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'VRAI'],
    ['FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'FAUX', 'VRAI', 'FAUX', 'VRAI']]
    Le listeMatrice.append(listeMatriceM) enregistre x fois la dernière ligne alors que la matrice listeMatriceM est réinitialisée à chaque fois (listeMatriceM[:]=[])

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

    Citation Envoyé par Arsene12 Voir le message
    Le listeMatrice.append(listeMatriceM) enregistre x fois la dernière ligne alors que la matrice listeMatriceM est réinitialisée à chaque fois (listeMatriceM[:]=[])
    Vous pourriez faire un "print" de listeMatrice à chaque itération pour voir comment bouge son "contenu".
    Et essayer de comprendre pourquoi avoir écrit listeMatriceM[:]=[].

    - W

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    926
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 926
    Points : 273
    Points
    273
    Par défaut
    Merci pour cette idée. J'ai donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         listeMatrice.append(listeMatriceM)
         #print(listeMatriceM)
         print(listeMatrice)
    et j'ai constaté que les listes précédentes sont remplacées par la nouvelle liste à chaque itération. Ce qui fait qu'au final, la liste des listes ne contient qu'une seule liste (la dernière) répétée x fois.

    Je comprends pas pourquoi python se comporte ainsi mais j'ai trouvé la solution pour remédier à ce problème. Il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeMatrice.append(tuple(listeMatriceM))  #  au lieu de : listeMatrice.append(listeMatriceM)
    Voici le bon 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
    def listage() :
       listeMatrice[:]=[]
       listeMatriceM[:]=[]
       myT = 0
       myLenght = int(len(items2))
       for x in range(0,myLenght):
         if myT ==0 :
            pass
         else: 
            listeMatrice.append(tuple(listeMatriceM))
            listeMatriceM[:]=[]
         for y in range(0,myLenght):
              myT = can.itemcget(items2[x][y],'text')       
              listeMatriceM.append(myT)
     
       listeMatrice.append(tuple(listeMatriceM))       
       print(listeMatrice)

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    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 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Citation Envoyé par Arsene12 Voir le message
    et j'ai constaté que les listes précédentes sont remplacées par la nouvelle liste à chaque itération. Ce qui fait qu'au final, la liste des listes ne contient qu'une seule liste (la dernière) répétée x fois.

    Je comprends pas pourquoi python se comporte ainsi mais j'ai trouvé la solution pour remédier à ce problème. Il faut écrire :
    En français, pour comprendre le sens de certaines phrases, il faut y retrouver sujet, verbe, complément, ... i.e. les constructions de bases qui vont permettre de trier les différents concepts.
    Avec un langage de programmation, c'est un peu pareil: lorsqu'on ne comprend plus, on décortique les constructions de bases pour démêler l'enchevêtrement des instructions et arriver à les comprendre (ou trouver l'erreur). Si vous ne pigez pas les constructions de bases, vous ne comprenez pas les instructions que vous écrivez et vous croisez les doigts pour que çà veuille bien "marcher".
    Et c'est sûr que retrouver dans votre code la construction de base:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> L = [1, 2, 3]
    >>> A = [L,] * 3
    >>> A[0][0] = 'X'
    >>> A
    [['X', 2, 3], ['X', 2, 3], ['X', 2, 3]]
    >>>
    n'est pas facile... mais le soucis rencontré est alors bien plus simple à expliquer et à assimiler.

    - W

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

Discussions similaires

  1. Lister un tableau avec le N° de l'enregistrement
    Par Aenean dans le forum Shell et commandes GNU
    Réponses: 17
    Dernier message: 29/10/2016, 21h17
  2. Lister un tableau imbriqué
    Par laloune dans le forum Langage
    Réponses: 2
    Dernier message: 29/09/2011, 14h56
  3. [Smarty] Lister un tableau en colonnes
    Par Laurentq1970 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 12/01/2007, 10h50
  4. [Tableaux] Lister le tableau avec UNION => Problème
    Par tutomania dans le forum Langage
    Réponses: 4
    Dernier message: 25/09/2006, 19h20
  5. [MySQL] Lister le contenu d'une table dans un tableau HTML
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 03/04/2006, 19h40

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