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 :

Disparition De Données Dans QTableView [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 103
    Points : 103
    Points
    103
    Par défaut Disparition De Données Dans QTableView
    Bonjour à tous

    voilà, je rencontre un petit soucis et je ne suis pas sûr de la méthode à adapter pour résolver ce problème :

    Mon programme permet d'un part de retourner un certain résultat en cliquant sur le bouton 'Calcul' et avec toutes les données nécessaires toujours présente dans mon QTableView.

    Chacune de ses données a une valeur initiale, un minimum, un maximum et une loi de dispersion : tout ça définissant chacune de mes colonnes de mon modèle.

    Cependant, lorsque je clique sur le bouton 'Simulation', on lance un calcul statistique qui prend en compte le min, le max et la loi de mes paramètres d'entrées, certaines données disparaissent...

    ou sont écrasées..?

    Nom : Capture_Data_Apres_1_Sim.PNG
Affichages : 228
Taille : 841 octets Nom : Capture_Data_Avant_Sim.PNG
Affichages : 226
Taille : 2,7 Ko

    Nom : Capture_Data_Apres_2_Sim.PNG
Affichages : 227
Taille : 733 octets

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Un QTableView est fait pour afficher des données contenues par ailleurs dans une base de données ou un objet liste. La liaison entre le tableau graphique et les données étant faite par un "model".

    Pour des calculs de type tableur, il vaut mieux prendre un QTableWidget.

    Autrement dit, si on compare grossièrement avec les produits Microsoft, QTableView est plus proche de Access, et QTableWidget plus proche de Excel.

    Peut-être est-ce la cause du problème?

    On peut cependant faire des calculs avec un QTableView puisqu'on peut modifier des données de la base de données. Mais si on veut l'afficher dans le tableau, il faut avoir prévu la place du résultat dans la base de données et demander sa mise à jour. Ce n'est pas forcément simple à faire.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 103
    Points : 103
    Points
    103
    Par défaut Disparition De Données Dans QTableView - 2
    Bonjour tyrtamos,

    les données récupérées pour initialiser mes tableaux de valeur proviennent de fichier csv.

    Par la suite, le futur utilisateur peut ajouter, supprimer des paramètres à sa guise et avoir une simulation différente(ça fonctionne déjà).

    Mais ce qui me chagrine, c'est pourquoi certaines valeurs disparaissent...ce qui fausse les résultats et les formules de base.

    On a la partie 'Data' et la partie 'Simulation', le tout dans une classe qui définit mon interface graphique avec toutes les opérations nécessaires à effectuer.

    Vu que pour le moment, je patauge, je pensais à geler les colonnes (mais est-ce nécessaire ou pas trop compliquer) ou encore passer en multi-thread...?

    En discutant avec un collègue, il ne pense pas que ça soit nécessaire de passer par des choses 'trop' compliquer mais faire des copies de nos objets sur lesquels

    je travaille. Mais pour le moment, j'obtiens toujours le même résultat.

    J'ai pensé à plusieurs idées :

    soit, dans la fonction qui affiche la simulation dans mon ihm et qui supprime certaines valeurs de mes données dans mon modele , je le re-rempli...après

    faut que je vois comment faire

    soit, dire au programme, une fois la simulation et son affichage terminée, remettre à jour mes tableaux...c'est pour ça que j'ai pensé aux threads.

    (bon ça revient à un peu au même dans l'idée...j'en conviens).

    Contrainte supplémentaire, il faut que le futur industriel n'attende pas trois plombe pour obtenir son résultat...

    Si vous avez d'autres idées, je suis tout ouïe.

    Cordialement,

    KM

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il faut en dire plus.

    Les données viennent d'un fichier csv, ok. Mais on ne peut pas brancher un fichier csv directement sur un QTableView, ne serait-ce que parce qu"un fichier csv n'est pas fait pour être modifié comme une base de données.

    Alors, sous quelle forme les données sont-elles liées au QTableView? Une liste de listes? Et quel est le modèle utilisé?

    Si vous ne savez pas répondre facilement à ces questions, c'est que le QTableView n'est pas adapté à ce que vous faites!

    Quand aux threads: on peut confier des calculs longs à des threads pour éviter de geler la partie graphique, mais les threads ne peuvent pas agir directement sur la partie graphique (le graphique n'est pas "thread-safe").
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 103
    Points : 103
    Points
    103
    Par défaut Disparition De Données - 3
    Bonjour tyrtamos ,

    merci pour votre retour. Voici de façon un peu plus explicite ce que je fais 'grossièrement'.

    Je lie/lis mes données csv à mon modèle que je mets à jour via les méthodes de data et setData().

    Le modèle est par la suite 'connecté' à ma vue elle-même connectée au layout principale.

    En gros, je fais sans rentrée dans les détails :

    J'ai une classe toto où l'on parcours les fichiers csv qui possède une liste d'objet correspondant que l'on remplit au fur et à mesure des besoins

    J'ai une classe titi qui dérive de QWidget où l'on fait : Correspondance données de toto et du modèle correspondant : self.toto.instancedobjet[index.row()] = self.model.data(...)

    Puis la mise à jour des données du modèle : self.model.setData(self.model.index(...), self.toto.instancedobjet[index.row()].MyObject.value)

    A partir des données récoltées, on définit un SLOT qui va reprendre/rappeler les méthodes de Monte Carlo et l'affichage de la simulation d'une classe tierce 'indépendante' qui ne gère que

    la partie statistique du 'problème'.

    Cependant, une fois la simulation lancée, certaines données disparaissent de mon modèle.

    Or ce n'est pas ce qu'on devrait obtenir à priori.

    En gros, une fois la simulation terminée, on 'récupère' la main.

    Il faudrait que l'utilisateur puisse 'retrouver' les données de mon modèle avec les cases remplies comme au début du lancement de l'application et

    relancer une autre simulation avec toutes les données nécessaires si besoin

    J'espère avoir été assez clair

    Merci de votre update.

    Cordialement,

    KM

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 103
    Points : 103
    Points
    103
    Par défaut Disparition De Données - suite
    Re-bonjour à tous ,

    est-ce que quelqu'un aurait un éventuel début de réponse ou idée à me suggérer ?

    Merci à tous, je commence à devenir 'fou'

    Bonne journée

    Cordialement,

    KM

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Désolé, mais je ne comprends toujours pas assez ton problème pour t'aider à trouver la faille.

    Quand je suis confronté à un problème comme ça, je crée un code à part que je simplifie progressivement pour mettre le doigt sur la cause. Mais tel que tu le présentes, ton problème, probablement causé par une utilisation inadaptée de QTableView, est noyé dans un ensemble trop compliqué.

    Voilà un petit code très simple qui représente ce que j'ai compris de ta question.

    J'introduis des données numériques issues d'un fichier csv sous forme de listes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        headers = ['colonne1','colonne2','colonne3', 'colonne4'] # titre des colonnes
        datas = [[1, 2, 3, 4], [5, 6, 7.1, 8.2], [9, 10, 11, 12]]
    Je crée ensuite, dans une fenêtre QWidget, un QTableView pour afficher ces données, lié à un modèle QStandardItemModel.

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3 PyQt5
     
    """
    code test pour un QTableView avec un modèle QStandardItemModel
    """
     
    import sys
    import os
     
    from PyQt5 import (QtWidgets, QtGui, QtCore)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, headers, datas, parent=None):
            super().__init__(parent)
            self.resize(800, 600)
     
            self.headers = headers
            self.datas = datas
     
            # crée le modèle
            self.model = QtGui.QStandardItemModel()
            #
            # met les titres des colonnes dans le modèle
            for j, header in enumerate(headers):
                self.model.setHorizontalHeaderItem(j, QtGui.QStandardItem(header))
            #
            # met les données dans le modèle
            for i, row in enumerate(self.datas):
                for j, col in enumerate(row):
                    item = QtGui.QStandardItem()
                    item.setData(col, QtCore.Qt.DisplayRole)
                    self.model.setItem(i, j, item)
     
            # crée le QTableView ainsi que son lien avec le modèle
            self.tablevue = QtWidgets.QTableView(self)
            self.tablevue.setModel(self.model)
            # ajuste la largeur des colonnes à leur contenu
            self.tablevue.resizeColumnsToContents()
     
            # crée le bouton pour récupérer les données
            self.bouton = QtWidgets.QPushButton("récup des données")
            self.bouton.clicked.connect(self.recup)
     
            # positionne les widgets dans la fenêtre
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.tablevue, 0, 0)
            posit.addWidget(self.bouton, 1, 0)
            self.setLayout(posit)
     
        #========================================================================
        def recup(self):
            """récupére et affiche en console les données après modification
            """
            # récupère les données modifiées
            datas2 = []
            for i in range(0, self.tablevue.model().rowCount()):
                datas2.append([]) # nouvelle ligne
                for j in range(0, self.tablevue.model().columnCount()):
                    item = self.tablevue.model().item(i,j)
                    data = item.data(QtCore.Qt.DisplayRole)
                    datas2[-1].append(data)
     
            # affiche les données récupérées
            print("Données modifiées: ", datas2)
            print("Données initiales: ", self.datas)
            print()
            print("Valeur de la donnée de la 2ème ligne (index=1) 2ème colonne (index=1):")
            i, j = 1, 1
            data = self.tablevue.model().item(i,j).data(QtCore.Qt.DisplayRole)
            print(data)
     
    #############################################################################
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
     
        # données à mettre dans le QTableView
        headers = ['colonne1','colonne2','colonne3', 'colonne4'] # titre des colonnes
        datas = [[1, 2, 3, 4], [5, 6, 7.1, 8.2], [9, 10, 11, 12]]
     
        fen = Fenetre(headers, datas)
        fen.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        fen.show()
        sys.exit(app.exec_())
    Comme on le voit en exécutant le code, les cases affichent bien les nombres entiers et les nombres flottants en fonction des données initiales. Quand on les modifie, on le fait avec un objet adapté QSpinBox ou QDoubleSpinBox qui s'affiche automatiquement. Autrement dit, on n'a pas besoin de dériver le modèle pour y ajouter le traitement par d'autres widgets que ceux prévues.

    Une fois l'affichage réalisé, l'utilisateur peut non seulement consulter ces données, mais également les modifier. Ces modifications se répercutent immédiatement dans les données contenus dans le modèle.

    Mais attention: les modifications ne se répercutent pas sur la liste initiale, mais seulement dans les données internes au modèle.

    Ainsi, cliquer sur le bouton permet de voir comment récupérer les données du modèle.

    Et s'il fallait récupérer les données modifiées pour en fabriquer un nouveau fichier csv, c'est comme ça qu'il faudrait faire.

    Le code est déjà pas mal commenté. Si ça colle avec tes besoins, j'espère que ce sera une bonne source d'inspiration.

    En tout cas, en faisant comme ça, on peut calculer n'importe quoi à partir des données affichées sans que certaines d'entre elles ne disparaissent!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 103
    Points : 103
    Points
    103
    Par défaut Disparition Des Données - Quasiment Résolu
    Bonjour tyrtamos ,

    déjà merci d'avoir pris le temps de m'avoir répondu et d'en avoir écrit autant

    Entre autres, je m'excuse .

    Apparemment, mon problème se résolve en effectuant une copie de mes données 'en gros' .

    Ce qui empêche que les données ne disparaissent de mon tableau après avoir lancé la simulation statistique.

    Je vous tiens informé de ma progression.

    Encore merci

    KM

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

Discussions similaires

  1. [QtGui] Affichage de données dans QTableView
    Par Arkefi dans le forum PyQt
    Réponses: 2
    Dernier message: 30/04/2015, 15h34
  2. disparition de donnée dans une requête
    Par le sportif dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/08/2013, 18h54
  3. Remplacer des données dans QTableView et pas dans la QTable
    Par katanaenmousse dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/10/2011, 14h45
  4. Réponses: 6
    Dernier message: 21/04/2010, 14h27
  5. Réponses: 0
    Dernier message: 23/04/2009, 15h18

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