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 :

Problème de statusBar


Sujet :

PyQt Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Problème de statusBar
    Bonjour à tous,
    Je ne parviens pas à afficher quoique ce soit dans la statusBar de ma fenêtre depuis le slot du signal de la classe BaseDeDonnees() dans mon script ci-dessous (il manque une partie du code au niveau des {...}).

    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
    class MainWindow(QMainWindow):
     
        def __init__(self,  parent=None):
            super(MainWindow, self).__init__(parent)        
     
        # Barre de titre de la fenêtre
            self.setWindowIcon(QIcon(DOSSIER+"\Images\\dd_icon_vertdegris.png"))
            self.resize(600, 400)
     
        # Barre de statut 
            self.statut = self.statusBar()        
            self.statut.setSizeGripEnabled(False)                   
            self.statut.showMessage("Prêt", 5000)
     
    {...}
     
        # Base de données
            self.bdd = BaseDeDonnees()
            self.bdd.base="delphibdd.sq3"
            self.bdd.accesBdd.connect(self.slotAccesBdd)        
     
    {...}
     
        # Slots
        def slotAccesBdd(self, arg1, arg2):
            print(arg1)
            self.statut.showMessage(arg1, 2000)
    Pour m'assurer que le slot était bien appelé, j'y ai ajouté et cela s'affiche correctement dans la console.

    J'ai dû commettre une erreur quelque part mais je ne comprends pas où. Un oeil averti pourrait-il m'éclairer?

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Comment dans la classe BaseDeDonnees as-tu créé ton pyqtSignal et quelle est la ligne de code de BaseDeDonnees.accesBdd.emit(?, ?) ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Tout d'abord, merci d'avoir pris le temps de me répondre
    Voici le script de ma classe BaseDeDonnees :
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    class BaseDeDonnees(QObject):
        """ Classe servant d'interface entre l'application et la base de données
        
            Propriétés :
                    BaseDeDonnees.base : chemin absolu et nom de la base de données
            
            Méthodes :
                    BaseDeDonnees.lire() : renvoie le résultat d'une requête sélection ou None, si rien n'est trouvé
                    
                    BaseDeDonnees.écrire() : insère un nouvel enregistrement dans une table de la base de données ;
                                                        renvoie True si l'insertion s'est faite correctement ou False sinon
                                                        
                    BaseDeDonnees.modifier() : modifie les informations d'un enregistrement préexistant d'une table de la base ;
                                                        renvoie True si la modification s'est faite correctement ou False sinon
                                                        
                    BaseDeDonnees.supprimer() : efface un ou plusieurs enregistrements dans un table de la base ;
                                                        renvoie True si la suppression s'est faite correctement ou False sinon                
            Signaux :
                    accesBdd : émit lorsque qu'un accès à la bdd est tenté
        """    
     
        #Signaux
        acces_bdd = pyqtSignal(str, int, name="accesBdd")
     
        def __init__(self, base=None):
            super(BaseDeDonnees, self).__init__()
            self.__base = base
     
        def __base(self):
            return self.__base
     
        def __setBase(self, base):
            self.__base = base
     
        base = property(fget=__base, fset=__setBase)
     
        def __ouverture(self):
            # Connection à la base de données
            if os.path.isfile(self.__base):
                self.__conn = sqlite3.connect(self.__base)
                self.__cur = self.__conn.cursor()
                #Activation des relations entre tables et de l'intégrité référentielle
                self.__cur.execute("PRAGMA foreign_keys = ON")
            else:
                self.acces_bdd.emit("Base de données introuvable")
     
        def __fermeture(self, msg, ok=True, id=0):
            # Fermeture de la base de données
            try:
                if ok:
                    self.__conn.commit()
                    self.__cur.close()
                    self.__conn.close()
                    self.acces_bdd.emit(msg, id)
                else:
                    self.__cur.close()
                    self.__conn.close()
                    self.acces_bdd.emit(msg, id)
            except:
                    self.acces_bdd.emit("Base de données introuvable", id)
     
        def __verification(self, sql):
            self.__cur.execute(sql[0], sql[1])
            return self.__cur.fetchall()
     
        def lire(self, sql, id=0):
            """
            Recherche dans les tables de la base de données les données correspondant aux critères spécifiés
            La méthode renvoie les données trouvées.
            """
            try:
                donnees = []
                self.__ouverture()
                self.__cur.execute(sql[0], sql[1])
                donnees = self.__cur.fetchall()
                if len(donnees):
                    self.__fermeture("{} enregistrement(s) trouvé(s)".format(len(donnees)), True, id)
                else:
                    self.__fermeture("Aucunes données trouvées", False)
                return donnees
            except:
                self.__fermeture("Erreur lors de la lecture des données", False, id)
     
        def ecrire(self, sql1, sql2):
            """
            Ajoute un enregistrement à une table de la base de données
            sql1 : requête servant à insérer les nouvelles données
            sql2 : requête servant à récupérer l'id du nouvel enregistrement
            La méthode renvoie l'id du nouvel enregistrement à travers le signal indiquant la réussite 
            """
            try:
                self.__ouverture()
                self.__cur.execute(sql1[0], sql1[1])
                self.__conn.commit()
                self.__cur.execute(sql2[0], sql2[1])
                id = self.__cur.fetchall()[0][0]
                self.__fermeture("Enregistrement et données ajoutés", True, id)
            except:
                self.__fermeture("Erreur lors de l'enregistrement des données", False)            
     
        def modifier(self, sql, id=0):
            """ Modifie les informations d'un enregistrement d'une table de la base de données """
            try:
                self.__ouverture()
                self.__cur.execute(sql[0], sql[1])
                self.__fermeture("Enregistrement modifié", True, id)                      
            except:
                self.__fermeture("Erreur lors de la modification de l'enregistrement", False, id)
     
        def supprimer(self, sql, id=0):
            """ Supprime un enregistrement d'une table de la base de données""" 
            try:
                self.__ouverture()
                self.__cur.execute(sql[0], sql[1])
                self.__fermeture("Enregistrement supprimé", True, id)
            except:
                self.__fermeture("Erreur lors de la suppression de l'enregistrement", False, id)
    Cette classe doit permettre d'exécuter des requêtes SQL du 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
    15
     
        def __setNom(self, nom):
            """ Méthode qui permet de definir le nom de l'élève"""
            if nom:
                # Présence d'un id :  mise à jour du nom
                if self.__id:               
                    sql=("UPDATE eleves SET nom=? WHERE id=?", (nom.strip().upper(), self.__id))
                    self.__bdd.modifier(sql, self.__id)
                # Absence d'id : création d'un nouvel enregistrement 
                else:                       
                    # Création d'un nouvel enregistrement par insertion du nom
                    sql1=("INSERT INTO eleves(nom) VALUES (?)", (nom.strip().upper(), ))      
                    # Récupération de l'id du nouvel enregistrement
                    sql2=("SELECT Max(id) FROM eleves", ())                                                    
                    self.__bdd.ecrire(sql1, sql2)

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Tout ce que je vois c'est que dans ta fonction def __ouverture(self) le signal n'est pas émit, sauf en cas d'échec.

    Sinon essaye plutôt ceci: self.statutBar().showMessage(arg1, 2000)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    J'ai changé mon self.statut pour un self.statusBar() comme tu l'as indiqué mais aucun changement.
    Pour ce qui est du signal dans def __ouverture(), je n'avais pas prévu que le signal soit émis à l'ouverture mais à la femeture par la méthode def __fermeture().
    Est-ce que le problème pourrait venir du fait du nombres d'accès à la base de données très rapprochés qui ne laisserait pas le temps aux messages successifs de s'afficher dans la barre de statut ?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Ça y est, j'ai compris.
    Ça ne fonctionnait pas car je faisais appel à la statusBar() depuis une classe héritant de celle de la QMainWindow.
    Je pensais que la référence à la statusBar() de ma QMainWindow se ferait alors implicitement.
    Mais il fallait plus explicite. Je suis donc passé de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.statusBar().showMessage("Message")
    à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.fentrePrincipale.statusBar().showMessage("Message")
    ou self.fenetrePrincipale est une référence directe à la QMainWindow de ma classe mère.

    Merci VinsS pour le temps que tu m'as consacré.

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

Discussions similaires

  1. [XL-2003] VBA excel problème sur contrôle statusbar
    Par wolop dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/08/2009, 15h07
  2. 2 problèmes sur le composant StatusBar
    Par BuzzLeclaire dans le forum Composants VCL
    Réponses: 7
    Dernier message: 05/02/2009, 10h04
  3. [API WIN32] Double problème: DialogBox && Statusbar
    Par Ackboo dans le forum Windows
    Réponses: 9
    Dernier message: 20/08/2006, 13h15
  4. [VBA-E] Problème avec Application.StatusBar
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/03/2006, 16h44
  5. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18

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