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 :

Créer une barre de recherche en PyQt5 sur une base de données PostgreSQL


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2021
    Messages : 8
    Par défaut Créer une barre de recherche en PyQt5 sur une base de données PostgreSQL
    Bonjour à tous!

    Cela fait quelques jours que je tente de créer une barre de recherche en PyQt5 sur une base de données PostgreSQL.
    Plus précisément, je suis sous Mac et j'ai installé Postgres.app ainsi que Python 3.9 avec le package PyQt5.

    J'ai donc souhaité dans un premier temps créer une table "tabletest": creatableqt.py
    NB : la fonction config() à laquelle le code fait référence se trouve dans ce fichier config.py et le fichier database.ini est de la forme :
    [postgresql]
    host=localhost
    database=nomdemabase
    user=nomdemonuser
    password=monmdp

    En exécutant mon fichier .py sur le terminal, tout se passe bien : je vois bien ma table "tabletest" remplie lorsque je me connecte à ma bdd Postgres et que je tape "SELECT * FROM tabletest". Cela m'indique que la connexion via les commandes PyQt5 ont bien marché.

    Dans un deuxième temps, je veux afficher cette tabletest dans une fenêtre. Après recherche sur Internet et grâce en particulier aux codes mis à disposition par @tyrtamos sur ce forum, j'ai vu qu'il fallait entre autres:
    - se connecter à la base PostgreSQL avec QSqlDatabase
    - créer un modèle QSqlRelationalTableModel et saisir les paramètres que l'on souhaite (setEditStrategy, setTable, etc)
    - créer la grille d'affichage QTableView et saisir les paramètres que l'on souhaite (setSortingEnabled, setModel, etc)
    - peupler le modèle avec les données de la table avec la méthode select()

    On peut trouver un script python qui marche bien sur cette discussion mais avec SQLite3: https://www.developpez.net/forums/d2...-base-donnees/

    J'ai donc téléchargé la base .zip et lancer le script. Tout s'est bien affiché donc j'ai voulu faire exactement la même chose mais avec PostgreSQL dans ce fichier : post.py

    Et là problème : lorsque j'exécute post.py j'obtiens une fenêtre blanche !

    Je n'arrive pas à voir d'où vient vient le problème car je n'ai modifié quasiment que la connexion à la bdd (de SQLite3 à PostgreSQL) en changeant le driver notamment et je sais que cela marche bien puisque je l'ai fait dans le fichier creatableqt.py qui fonctionne...

    Pourriez-vous m'aider s'il-vous-plaît?

    PS: Désolé pour le long message !
    PSS: C'est mon premier post sur le forum et je suis assez débutante en programmation avec PyQt5, je m'excuse d'avance si je pose des questions un peu "bêtes"

  2. #2
    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,

    Juste une idée: peut-être que postgresql renvoie des données qui ne sont pas compatibles avec ma classe MonSqlRelationalDelegate. J'avais écrit celle-ci pour faciliter l'édition des données de différents types, issues de sqlite3.

    Je suggère donc de remplacer la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.vuetable.setItemDelegate(MonSqlRelationalDelegate(self.vuetable))
    Par la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.vuetable.setItemDelegate(QtSql.QSqlRelationalDelegate(self.vuetable))
    Tu n'auras ainsi que le delegate par défaut.

    Essaie, et dis ce que ça fait.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Pimboli Voir le message
    Et là problème : lorsque j'exécute post.py j'obtiens une fenêtre blanche !

    Je n'arrive pas à voir d'où vient vient le problème car je n'ai modifié quasiment que la connexion à la bdd (de SQLite3 à PostgreSQL) en changeant le driver notamment et je sais que cela marche bien puisque je l'ai fait dans le fichier creatableqt.py qui fonctionne...

    Pourriez-vous m'aider s'il-vous-plaît?
    Une fenêtre blanche (ça m'est arrivé aussi) signifie que le programme plante à un moment dans un module Qt. Le module s'arrête donc et rien de ce qui se trouve en dessous (les affichages éventuels) n'est exécuté.
    Toutefois, la console Python, elle, indique le nom du module et la ligne qui fait planter. Sauf si tu as lancé ton source en double cliquant dessus, alors il n'y a pas de console Python.

    Donc
    1) tu ouvres une console de commandes (MsDos sous Windows, fenêtre shell sous Linux)
    2) tu vas à l'endroit où se trouve ton code
    3) tu l'exécutes via la commande "python programme.py" (ou "python3 programme.py"). Le code s'exécutera cette fois dans la console dans laquelle tu es et t'affichera tous les soucis qu'il rencontre
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2021
    Messages : 8
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour tyrtamos,

    Merci pour votre réponse ! Je viens de procéder à la modification mais malheureusement, rien n'a changé j'obtiens toujours une fenêtre blanche ...

    Citation Envoyé par Sve@r Voir le message
    Bonjour Sve@r,

    Je vous remercie pour votre réponse également ! J'ai en effet lancé mon programme depuis la console de mon Mac avec la commande "python3 pgrm.py" mais la console ne renvoie aucune erreur : le programme s'exécute "bien" mais la fenêtre en sortie est vide donc je n'ai aucune indication sur la provenance de l'erreur dans mon script ^^'

  5. #5
    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,

    Trois idées.

    1- avant d'incriminer le graphique, il faudrait peut-être vérifier que l'accès aux données de la base est ok. Pour ça, ce serait intéressant de faire un petit code qui récupère une données en dehors du QTableView (instruction SQL "SELECT") et l'affiche en console.


    2- ajouter des print pour pister le déroulement du lancement en affichant la valeur de certaines variables.


    3- De temps en temps, j'ai un programme PyQt5 en cours de mise au point qui plante sans aucun message d'erreur, et je déteste!

    Alors, j'ai trouvé une solution qui marche pas mal:

    - créer un petit module à importer. Je l'appelle msgerreur.py, qui contient:

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    from PyQt5.QtCore import (QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, 
                        QtFatalMsg, QtSystemMsg)
    from PyQt5.QtWidgets import QMessageBox
     
    #############################################################################
    def messagederreur(typerr, contexte, msgerr):
        """Permet d'afficher et/ou de neutraliser les messages d'erreur.
           Pour les messages critiques: affiche dans une fenêtre graphique.
           Mise en place par: QtCore.qInstallMessageHandler(messagederreur)
        """
        if typerr==QtDebugMsg:
            # exemple de désactivation d'un message
            #if "QWindowsFileSystemWatcherEngine: unknown message" in msgerr:
            #    return 
            print("DEBUG:\n{}\n".format(msgerr))
     
        elif typerr==QtWarningMsg:
            # exemple de désactivation d'un message
            #if "QFont::setPixelSize: Pixel size <= 0 (0)" in msgerr:
            #    return
            print("WARNING:\n{}\n".format(msgerr))
     
        elif typerr in [QtCriticalMsg, QtFatalMsg, QtSystemMsg]:    
            print("ERREUR CRITIQUE:\n{}\n".format(msgerr))
            QMessageBox.critical(None, 
                "ERREUR CRITIQUE:",
                "{}\n".format(msgerr))
        else:
            # message retourné par QtCore.QtInfoMsg créé à partir de Qt 5.5
            print("INFO:\n{}\n".format(msgerr))
    - Le programme principal l'importe de la façon suivante, juste après le lancement de la bibliothèque PyQt5:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        app = QtWidgets.QApplication(sys.argv)
     
        from msgerreur import messagederreur  
        QtCore.qInstallMessageHandler(messagederreur)
     
        ...
    En cas d'erreur, même fatale, un petite fenêtre s'ouvre pour afficher le message d'erreur. En plus du même message pour la console (grâce aux "print").

    Ce n'est pas garanti, mais quand ça marche, ça diminue considérablement le temps de mise au point.

    Dans ton cas, ce n'est pas une erreur fatale, mais il y a peut-être un warning qui serait une piste de recherche.

    A noter que cette méthode permet aussi de supprimer certains warnings sans conséquence, afin d'éviter de perturber l'utilisateur pour rien.

    Essaie! et dis ce que ça fait.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pimboli Voir le message
    Je vous remercie pour votre réponse également ! J'ai en effet lancé mon programme depuis la console de mon Mac avec la commande "python3 pgrm.py" mais la console ne renvoie aucune erreur : le programme s'exécute "bien" mais la fenêtre en sortie est vide donc je n'ai aucune indication sur la provenance de l'erreur dans mon script ^^'
    Alors il faut rajouter du print() dans le script aux endroits clés pour vérifier qu'il a bien les bonnes valeurs au bon moment. Ces affichages se feront ensuite dans ladite console.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2021
    Messages : 8
    Par défaut
    Bonjour tyrtamos,

    Merci pour votre message et toutes les pistes !

    1 - Comme vous me l'avez suggérer, j'ai testé l'accès aux données en ajoutant dans mon fichier creatableqt.py les lignes de code suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    query.exec_("select * from %s" % matable)
    rec = query.record()
     
    print "Number of columns: %d" % rec.count()
     
    motCol = rec.indexOf("mot")
    while query.next():
        print query.value(motCol)
    Lorsque j'exécute mon programme, j'ai bien la liste des mots qui s'affiche dans ma console, c'est déjà une bonne chose haha

    2 - J'ai ajouté quelques print() par exemple pour afficher le nom de ma table et être sûre que l'on parle bien du même objet et il ne me semble pas y avoir d'incohérence. Pareil pour la "variable" "db.open()". Auriez-vous d'autres variables à me suggérer d'afficher ? Car je ne vois pas bien ce que l'on peut "printer" lorsqu'on crée les modèles/grilles.

    3 - Merci pour le code ! Je viens de tester tout cela (création de msgerreur.py et implémentation dans le code principal) mais toujours le même problème : une fenêtre blanche et aucun message d'erreur pour m'aiguiller sur la provenance du problème ><

    Merci pour votre temps !

  8. #8
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2021
    Messages : 8
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Alors il faut rajouter du print() dans le script aux endroits clés pour vérifier qu'il a bien les bonnes valeurs au bon moment. Ces affichages se feront ensuite dans ladite console.
    Bonjour Sve@r,
    Vous avez raison, je vais essayer de faire cela. Par "endroits clés", avez-vous une idée de plus précise sur les variables à suivre ?
    Merci pour votre message en tout cas !

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pimboli Voir le message
    Par "endroits clés", avez-vous une idée de plus précise sur les variables à suivre ?
    J'avais pas fait gaffe que tu avais donné un lien vers ton code dans ton premier post (généralement on préfère avoir le code directement intégré)

    Or je l'ai récupéré, l'ai adapté à ma bdd (modifié donc juste les paramètres de connexion et de table) et il est parfaitement fonctionnel. Chez-moi, il affiche bien ma table. Et je peux changer de bdd et de table, il fonctionne toujours aussi bien.

    Je pense donc que le souci vient plutôt de ta bdd. Déjà par exemple checker le contenu de "params" serait un bon point de départ (vérifier aussi si Postgres accepte une connexion avec les paramètres tels qu'ils sont stockés dans cette variable). Par exemple moi n'ayant pas le module "config" j'ai de mon côté rempli cette variable manuellement en lui mettant des paramètres que je savais adéquats par rapport à mon serveur bdd. Vérifier aussi (via Postgres cette fois) le contenu de la table "tabletest"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2014, 14h04
  2. Réponses: 5
    Dernier message: 25/03/2014, 10h35
  3. Créer une base de données SQL-Server sur un serveur distant
    Par algeriano.29 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/01/2014, 15h24
  4. [PB 10.5] Créer une base de données sur Sybase
    Par brania dans le forum Powerbuilder
    Réponses: 0
    Dernier message: 03/04/2009, 10h02
  5. Créer une base de donnée sur un réseau
    Par mohamed2006 dans le forum Débuter
    Réponses: 3
    Dernier message: 07/03/2007, 23h09

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