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 :

Éditer/récupérer le contenu d'un tableau [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut Éditer/récupérer le contenu d'un tableau
    Bonjour à tous,
    Aujourd'hui, je suis confronté à un problème avec les QTableWidget. En effet, le but de mon programme est d'ouvrir un fichier du type texte et d'en récupérer son contenu (en l'occurrence, c'est une liste qu'il contient), puis d'afficher celui-ci dans un tableau. Jusque là pas de problème, le tout s'affiche. Mais je cherche désespérément à pouvoir éditer le contenu d'un item du tableau ou de récupérer son contenu depuis mon code.
    J'ai donc cherché et trouvé sur internet ce type de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=self.ui.tableau.item(ligne,colonne)
    print(a.data(0).toString())
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=self.ui.table.item(X,Y)
    print(a.text())
    Mais ces deux essais sont sans succès, Python me retourne l'erreur 'NoneType' object has no attribute 'data' ou 'NoneType' object has no attribute 'text'
    Du coup si quelqu'un à une idée, merci d'avance

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Je pense que tu as simplement un soucis quand à l'identification de tes objets.

    tableau dans le premier exemple et table dans le second ?

    Ou, éventuellement, tes ligne-colonne sont hors maximums. (columnCount(), rowCount())

    Quoiqu'il en soit, ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for i in range(0, self.table.rowCount()):
        print unicode(self.table.item(i, 0).text())
    me retourne bien les contenus de la première colonne.

    Utilise des print pour identifier tes objets.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Bonjour et merci de ta réponse
    Pour le soucis d'identification, c'est ma faute, les deux s'appellent bien tableau.
    Malheureusement, j'ai essayé ce que tu m'as proposé mais ça ne fonctionne pas :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for X in range(50):
           print(str(self.ui.tableau.item(0, X)).text())
    Python me retourne : AttributeError: 'str' object has no attribute 'text'

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    C'est normal: c'est la conversion str qui devrait englober .text() et non s'arrêter à item. Essaie ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for X in range(50):
        print(str(self.ui.tableau.item(0, X).text()))

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Bonjour et merci de ta réponse, je viens d'essayer ton code, mais il me retourne encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: 'NoneType' object has no attribute 'text'

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Alors tu cherches à obtenir un contenu texte dans une case qui ne contient rien.

    En effet, un QTableWidget se crée avec des cases complètement vides. Pour les remplir, il faut mettre des QTableWidgetItem initialisés avec une chaine vide. Si ce n'est pas le cas, item renvoie None.

    Pour se "débarrasser" de ce genre de problème, j'utilise 2 fonctions du genre de celle-ci (Python 2.7):

    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
    #############################################################################
    def setcase(table, row, col, val):
        """met la valeur val dans la case [row, col] de la table (QTableWidget)
           val est en unicode
        """
        # recherche d'un éventuel QTableWidgetItem dans la case
        item = table.item(row, col)
        if item == None:
            # la case n'a jamais été initialisée: on lui met un QTableWidgetItem
            item = QtGui.QTableWidgetItem()
            table.setItem(row, col, item)
        # et on met la valeur fournie
        item.setText(val)
     
    #############################################################################
    def getcase(table, row, col):
        """Retourne la valeur (unicode) de la case [row, col] de la table"""
        # recherche d'un éventuel QTableWidgetItem dans la case
        item = table.item(row, col)
        if item == None:
            # la case n'a jamais été initialisée: on retourne une chaine vide
            return u""
        else:
            return unicode(item.text())
    Bien entendu, si on place d'autres widgets d'autres types dans certaines cases (combobox, etc...), il faut modifier ces fonctions pour en tenir compte.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Le soucis c'est que j'ai déjà initialisé mes cellules. J'ai un fichier du type json qui comporte une première liste dans lequel je sauvegarde mes résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    J'ai des tirages, et si un numéro X fait partit d'un de ses tirages, alors il ajoutera "+1" dans la liste des résultats à l'indice "X+1".
    Du coup graphiquement, mon programme récupère cette liste et ajoute son contenu dans un tableau de 50 colonnes. Maintenant, j'ai une seconde liste avec des tirages également dans un fichier json :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[48, 49, 39, 7, 13, 1, 11], [46, 27, 19, 15, 24, 8, 4], [35, 5, 41, 10, 31, 5, 9], [12, 9, 22, 2, 36, 9, 2], [50, 47, 25, 6, 42, 3, 1]]
    Depuis mon programme je peux ajouter des tirages dans cette liste que celui-ci récupère. Il met donc à jour le tableau en modifiant la liste des résultats par rapport aux chiffres de ce tirage. Pour cela je récupère le contenu de la cellule et y ajoute "+1". Mais c'est à ce moment que je bloque :s

    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
    # -*- coding: utf-8 -*-
    #Certaines fonctions ne sont jamais appelés (ex: fx de sauvegarde), c'est normal, je n'ai pas finis le programme
    from PyQt4 import QtGui, QtCore, Qt
    from ui_tirage import Ui_Form
    import sys
    import json
     
    class Tirage(QtGui.QWidget):
        def __init__(self, title = "Default", parent = None):
            super(Tirage, self).__init__(parent)
            self.title = title
            self.ui = Ui_Form()
            self.ui.setupUi(self)
            self.setWindowTitle(self.title)
            resultats = []
            tirages = []
            self._gettirages(tirages)
            self._getlists(resultats)
            self._initSlotButtons()
     
        def _Boutons(self):
            pass
     
        def _gettirages(self, tirages):#Fonction d'ouverture du fichier avec les tirages enregistrés
            with open('tirages.json') as file:
                tirages = json.load(file)
                file.close()
            return self._comparateur(tirages)
     
        def _savetirages(self, tirages):#Fonction de sauvegarde des tirages quand un nouveau est ajouté
            with open("tirages.json", "w") as file:
                json.dump(tirages, file)
                file.close()
     
        def _getlists(self, resultats):#Fonction de récupération de la liste des résultats
            with open("resultats.json") as file:
                resultats = json.load(file)
                file.close()
            for X in range(50):
                #Ici j'initialise mes items dans lequel je met le contenu de la liste à un indice X
                item = self.ui.tableau.setItem(0, X, Qt.QTableWidgetItem(str(resultats[X])))
            return resultats
     
        #Ici je compare les tirages enregistrés avec avec la liste des résultats et le tableau.
        #Si il y a un nouveau tirage, je met à jour le tableau et la liste des résultats
        def _comparateur(self, tirages):
            print(tirages)
            for Y in range(len(tirages)):
                for X in range(7):
                    if X < 5:
                        for idnumero in range(50):
                            if idnumero+1 == tirages[Y][X]:
                                print(str(self.ui.tableau.item(0, X).text()))
     
     
        def _savelists(self, resultats):#Fonction de sauvegarde de la liste des résultats
            with open("resultats.json", "w") as file:
                json.dump(resultats, file)
                fichier.close()
     
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        w = Tirage("TEST")
        w.show()
        sys.exit(app.exec_())
    En espérant avoir été assez clair

  8. #8
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Tu es sur de ton coup là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                item = self.ui.tableau.setItem(0, X, Qt.QTableWidgetItem(str(resultats[X])))
    ?

    QTableWidgetItem appartient au module QtGui, pas Qt.

    ...

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Je viens de modifier en remplaçant Qt, par QtGui. Mais Python me renvoit toujours l'erreur 'NoneType' object has no attribute 'text' pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(str(self.ui.tableau.item(0, X).text()))

  10. #10
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Je pense que je comprend, tu aurais dût avoir une erreur avec Qt.QTableWidgetItem() mais ça ne s'est pas produit parce que tu confond tes fonctions _gettirages() et _getlists()

    Regarde bien ton code, tu compare tes éléments de tableau (_comparateur()) avant de les avoir créés (_getlists()).

    CQFD (ce qu'il fallait deviner)

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Ha oui effectivement ! J'avais pas remarqué ! Bien joué !

    Merci du coup de m'avoir aidé, c'est bien sympa !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/06/2011, 19h27
  2. Récupèrer le contenu d'un tableau html
    Par solicel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/07/2009, 16h37
  3. Récupérer le contenu d'un tableau
    Par KDavid dans le forum Langage
    Réponses: 7
    Dernier message: 16/03/2009, 13h32
  4. Réponses: 8
    Dernier message: 21/12/2007, 16h42
  5. Réponses: 2
    Dernier message: 04/06/2007, 13h57

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