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

PyQt Python Discussion :

Remplissage QtableWidget : Passer d'une liste avec des réels à une liste str


Sujet :

PyQt Python

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Points : 59
    Points
    59
    Par défaut Remplissage QtableWidget : Passer d'une liste avec des réels à une liste str
    Bonjour à tous,

    Je bloque sur un petit soucie d'affichage d'un QtableWidget.
    Je charge des données d'une pas de données qui sont deux string et trois réels. Le soucie est que je ne peux que mettre des str dans un QtqbleWidget car sinon les items ne s'affichent pas.
    Voici le bout de code concerné :
    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
     
            self.proj_selected = self.tableWidget_ListProj.item(row, col).text()
            try:
                conn = psycopg2.connect("dbname='qgis_db' user='postgres' host='localhost' password='postgresql'")
            except:
                print "I am unable to connect to the database"
            cur = conn.cursor()        
            self.dataProj= cur.execute(" SELECT pt_projname,pt_projnum, pt_x,pt_y,pt_z FROM point where pt_projname ='%s';"%(self.proj_selected))
            self.dataProj = cur.fetchall()
            for i in self.dataProj :
                for j in i :
                    j= str(j)
                    self.dataProj.append(j)
            print self.dataProj
            lignes = len(self.dataProj)
            columns =5
            i = 0
            j = 0
            self.tableWidget_DisplayProj.setRowCount(lignes)
            self.tableWidget_DisplayProj.setColumnCount(columns)
            self.tableWidget_DisplayProj.setHorizontalHeaderLabels(['name', 'num','x','y','z'])
            self.tableWidget_DisplayProj.horizontalHeader().setResizeMode(0, QHeaderView.Stretch)
     
            for i in range(lignes):
                for j in range(columns):
                    item = QtGui.QTableWidgetItem(self.dataProj[i][j])
                    self.tableprojet = self.tableWidget_DisplayProj.setItem(i, j, item)
    Le soucie se situe à la partie censé transformer tous les élements de ma liste en str:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in self.dataProj :
                for j in i :
                    j= str(j)
                    self.dataProj.append(j)
    Mon code plante et plus rien ne répond. Je ne dois pas bien m'y prendre et je ne vois pas comment contourner ce problème. Auriez vous une idée ?

    Pour remplacer l'importation de postgis voici un jeu de donnée si nécessaire :
    (pt_projname, pt_projnum, pt_x, pt_y, pt_z)
    ('STG Ahlsdorf', '4250 05 03115 67', 4579336, 5744309, 79.4)
    ('STG Ahlsdorf', '4250 05 03115 67', 4579219, 5744142, 79.2)

    Merci d'avance pour vôtre aide !

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

    Citation Envoyé par aurelie.guegan.15 Voir le message
    Mon code plante et plus rien ne répond. Je ne dois pas bien m'y prendre et je ne vois pas comment contourner ce problème. Auriez vous une idée ?
    Il faudrait que vous passiez un peu de temps à réfléchir sur comment maîtriser les structures de données élémentaires que sont les listes et les "for", "while"...
    Etudiez ce bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> L = [1,2,3]
    >>> for e in L:
    ...     L.append(e)
    ...     print (e, len(L))
    ...     if len(L) > 30: break
    ...
    1 4
    2 5
    3 6
    1 7
    Il fait la même chose que le votre: la liste L devrait être un invariant maisje lui ajoute une entrée à chaque itération.
    Un truc pareil ne se terminera jamais...

    Vous voyez que Qt, les bases de données sont "accessoires" par rapport à la maîtrise de ce genre de concepts.
    Si vous ne les maîtrisez pas, pas facile de penser comment coder proprement des choses à priori simples.

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

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Points : 59
    Points
    59
    Par défaut
    Oui C'est d'une logique imparable ! Si j'ajoute des éléments à ma liste ma boucle ne fini pas, mais si on y pense pas à ce détail, on peut toujours chercher. Merci de la remarque !

    J'ai donc un peu réfléchie à comment organiser ce code pour faire ce que je veux.(cad remplir un QtableWidget 5 col et x lignes) J'ai presque réussi mais j'ai un soucie avec un dictionnaire et l'affichage des données.

    Le principe :
    A l'origine j'ai un dictionnaire du style :
    dic_init { ['0' : 'nom1', 'num1', x1,y1,z1], '2' : 'nom2', 'num2', x2,y2,z2]}avec x,y,z des réels
    Je veux au final :
    dic_final{ ['0' : 'nom1', 'num1', x1,y1,z1], '2' : 'nom2', 'num2', x2,y2,z2]}avec x,y,z des string
    Je souhaite n'avoir que des string donc je prend chaque liste initiale de mon dic_init que j’itère pour transformer les real en str et les enregistre dans une liste final. J’implémente ensuite mon dic_final avec cette liste finale.

    Voici mon 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
     
            self.proj_selected = self.tableWidget_ListProj.item(row, col).text()
            try:
                conn = psycopg2.connect("dbname='qgis_db' user='postgres' host='localhost' password='postgresql'")
            except:
                print "I am unable to connect to the database"
            cur = conn.cursor()        
            self.dataProj= cur.execute(" SELECT pt_projname,pt_projnum, pt_x,pt_y,pt_z FROM point where pt_projname ='%s';"%(self.proj_selected))
            self.dataProj = cur.fetchall()
     
            self.dataProjstr={}
            self.listdata =[]
            self.intcle=-1
            for cle in range(len(self.dataProj)):
                self.dataProjstr.get('%s'%str(cle))
                #print 'self.dataProjstr', self.dataProjstr
     
            for i in self.dataProj :
                self.intcle =self.intcle+1
                self.strcle= str(self.intcle)
                for j in i :
                    j= str(j)
                    self.listdata.append(j)
                self.dataProjstr[self.strcle]=self.listdata
               # print 'self.dataProjstr',self.dataProjstr
                self.listdata=[]
     
            print '____'
            print 'dataProj str', self.dataProjstr
            lignes = len(self.dataProj)
            columns =5
            i = 0
            j = 0
            self.tableWidget_DisplayProj.setRowCount(lignes)
            self.tableWidget_DisplayProj.setColumnCount(columns)
            self.tableWidget_DisplayProj.setHorizontalHeaderLabels(['name', 'num','x','y','z'])
            self.tableWidget_DisplayProj.horizontalHeader().setResizeMode(0, QHeaderView.Stretch)
     
            for i in range(lignes):
                for j in range(columns):
                    item = QtGui.QTableWidgetItem(self.dataProjstr[i][j])
                    self.tableprojet = self.tableWidget_DisplayProj.setItem(i, j, item)
    Mon résultat est :
    un dictionnaire final, seulement les données ne sont pas dans l'ordre que j'espérais :
    dataProj str {
    '1': ['STG Ahlsdorf', '4250 05 03115 67', '4579219', '5744142', '79.2'],
    '0': ['STG Ahlsdorf', '4250 05 03115 67', '4579336', '5744309', '79.4'],
    '3': ['STG Ahlsdorf', '4250 05 03115 67', '4579720', '5744276', '79.4'],
    '2': ['STG Ahlsdorf', '4250 05 03115 67', '4579385', '5744164', '79.3'],
    '5': ['STG Ahlsdorf', '4250 05 03115 67', '4579488', '5744318', '79.4'],
    '4': ['STG Ahlsdorf', '4250 05 03115 67', '4579590', '5744230', '79.4'],
    '7': ['STG Ahlsdorf', '4250 05 03115 67', '4583008', '5746676', '81.0'],
    '6': ['STG Ahlsdorf', '4250 05 03115 67', '4582957', '5746316', '80.7'] }
    J'ai pas réussi à comprendre pourquoi j'ai l'ordre 1 0 3 2 5 4 6 7 et non 0 1 2 3 4 5 6 7 8

    Au niveau mon QtableWidget :
    j'ai bien la création des lignes mais bon tableau est vide, rien ne s'affiche, alors que tous mes items sont bien des str maintenant.
    j'i ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    item = QtGui.QTableWidgetItem(self.dataProjstr[i][j])
    KeyError: 0
    Encore un petit coup de pouce me serait utile pour savoir dans quelle direction chercher
    Merci d'avance !

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

    Au départ vous avez ce que retourne .fetchall, c'est une liste de tuples dont vous souhaitez transformer les nombres en "str".
    Pour imaginer comment faire çà, il suffit de lancer la console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> tuples = [ (1,2,3), (4,5,6), (7,8, 9) ]
    >>> tuples
    [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
    Puis vous reconstruisez une autre liste de tuple en appliquant str aux éléments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> str_tuples = [ tuple([ str(x) for x in v ]) for v in tuples ]
    >>> str_tuples
    [('1', '2', '3'), ('4', '5', '6'), ('7', '8', '9')]
    Si vous transformez une liste en dict où les clés seront les indices, vous perdrez l'ordre car excepté collections.OrderedDict, le hash des clés n'a aucune raison d'être "bien rangé"...

    Essayer tous les trucs qui vous passent par la tête en espérant que çà tombe en marche?

    Pourquoi vous ne remplissez pas le QTableWidget directement, genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            data= cur.execute(" SELECT pt_projname,pt_projnum, pt_x,pt_y,pt_z FROM point where pt_projname ='%s';"%(self.proj_selected))
            data = cur.fetchall()
     
            lignes = len(data)
            widget = self.tableWidget_DisplayProj
            columns =5
            widget.setRowCount(lignes)
            widget.setColumnCount(columns)
            widget.setHorizontalHeaderLabels(['name', 'num','x','y','z'])
     
            for i in range(lignes):
                for j in range(columns):
                    item = QtGui.QTableWidgetItem(str(data[i][j]))
                    widget.setItem(i, j, item)
    moins de lignes = moins de bugs à corriger et de digressions à comprendre...

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

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Points : 59
    Points
    59
    Par défaut
    le hash des clés n'a aucune raison d'être "bien rangé".
    Ok je pensais qu'il gardait l'ordre d'ajout des clés. C'est bon à savoir.

    J'avais eu l'idée du str() mais je n'avais pas réussi à l'utilisé car je ne savais pas où le mettre dans mon code pour faire la conversion. En effet je me suis bien compliqué pour le coup.
    Merci du coup de main ! J'ai réussi à faire ce que je souhaitais sur cette partie !

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

Discussions similaires

  1. Critères avec opérateurs dans une requête avec des champs calculés
    Par lmollard dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 11/05/2008, 18h53
  2. Remplir une liste avec des noms de fichiers
    Par Claude_Azoulai dans le forum ASP.NET
    Réponses: 1
    Dernier message: 11/09/2007, 08h00
  3. Créer une liste avec des noms de fichiers
    Par Jeffboj dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 05h48
  4. [Librairie] Mettre en page une liste avec des puces
    Par karibouxe dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 27/03/2006, 17h53
  5. [MFC] creer une liste avec des check????
    Par ginounet dans le forum MFC
    Réponses: 4
    Dernier message: 16/06/2004, 11h47

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