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 :

Gestion de login avec differents interfaces graphiques de differents groupes d'utilisateurs [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Points : 41
    Points
    41
    Billets dans le blog
    1
    Par défaut Gestion de login avec differents interfaces graphiques de differents groupes d'utilisateurs
    Bonsoir;
    Je viens ici pour demander la faisabilité de se logguer avec une fenetre principale et ensuite pour chaque groupe d'utilisateur ouvrir une fenetre correspondante tout en detruisant la fenetre de logging et pouvoir l'invoquer après un certain temps d'inactivité. Merci.

    NB: J'ai essayé en suivant les astuces donné ici mais dès que je detruis la fenetre de logging tout disparait.

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

    Je ne suis pas sûr de comprendre le problème.

    Mais au cas où, essaie d'ajouter cette instruction au lancement (après app = QApplication(sys.argv)):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app.setQuitOnLastWindowClosed(False)
    Explication: par défaut, le programme s'arrête après la fermeture (.close()) de la dernière fenêtre sans parent. L'instruction proposée désactive cette fonction. A noter que c'est une bonne pratique de donner un parent à chaque fenêtre secondaire: vérifie que c'est ce que tu fais.

    Autre solution: au lieu de fermer une fenêtre (.close()), on peut se contenter de la cacher (.hide()), ce qui permet de la faire réapparaître plus tard si nécessaire (.show()).

    Si ça ne suffit pas, il vaudrait mieux mettre un petit code de test qui montre le problème à résoudre. Tu peux t'inspirer du code que j'avais donné dans le fil dont tu donnes le lien.
    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 du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Points : 41
    Points
    41
    Billets dans le blog
    1
    Par défaut
    Bonsoir;
    Merci pour l'aide, j'ai essayé et jusqu'à présent, je ne suis pas satisfait. Voici où j'en suis :
    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
    #!/usr/bin/env python
     
    import os
    import sys
     
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    from PyQt4.QtSql import *
     
    import dbModel
    import accueilA
    import accueilB
    import accueilC
     
     
    class Login(QDialog):
     
     
        def __init__(self, parent=None):
            super(Login, self).__init__(parent)
            self.setWindowTitle(u"Connexion ....")
     
            self.edtUsername = QLineEdit(self)
            self.edtUsername.setText(u"identifiant?")
            self.edtUsername.returnPressed.connect(self.close)
     
            self.edtPassword = QLineEdit(self)
            self.edtPassword.setText(u"mot de passe?")
            self.edtPassword.setEchoMode(QLineEdit.Password) # ne pas afficher le mot de passe
            self.edtPassword.returnPressed.connect(self.close)
     
            self.btnConnexion = QPushButton('Connexion', self)
            self.btnConnexion.clicked.connect(self.close)
     
            layout = QFormLayout()
     
            layout.addRow("Nom d'utilisateur : ",self.edtUsername)
            layout.addRow("Mot de passe : ", self.edtPassword)
            btnAnnuler = QPushButton("Annuler")
            btnAnnuler.clicked.connect(self.close)
            l = QHBoxLayout()
            l.addStretch()
            l.addWidget(self.btnConnexion)
            l.addWidget(btnAnnuler)
            layout.addRow(l)
            self.setLayout(layout)
     
            self.edtUsername.setFocus()
            self.edtUsername.selectAll()
     
        def closeEvent(self, event):
     
            user = self.edtUsername.text()
            passe = self.edtPassword.text()
            print("Username : %s et le password : %s "%(user,passe))
     
            self.cv = dbModel.isElementOf(user,passe)
            if self.cv == 1 :
                ecran = accueilA.MainWindow()
                ecran.show()
            elif self.cv == 2:
                ecran = accueilB.MainWindow()
                ecran.show()
            elif self.cv == 3:
                ecran = accueilC.MainWindow()
                ecran.show()
            else:
                QMessageBox.critical(self, "Database Connection",
                "Database Error: Nom d'utilisateur ou mot de passe incorrect!")
            # acceptation de la fermeture de la fenêtre
            event.accept()
     
     
    def main():
     
        app = QApplication(sys.argv)
        app.setQuitOnLastWindowClosed(False)
     
     
        print("Connecting to database...")
        db = QSqlDatabase.addDatabase("QPSQL")
        db.setHostName("localhost")
        db.setDatabaseName("MABASE")
        db.setUserName("name")
        db.setPassword("*****")
    #    
        ok = db.open()
     
        if ok:
            print("About to handle database stuff")
            app.processEvents()
            #dbModel.createDBTables()
        else:
            QMessageBox.warning(None, "Database Connection",
                QString("Database Error: %1").arg(db.lastError().text()))
            sys.exit(1)
            print("Database not handle")
        cnx = Login()
        cnx.exec_()
        sys.exit(app.exec_())
     
    main()
    Les accueilX sont des modules contenant les QMainWindow. Je veux détruire le dialog Login seulement si l'identification passe. Je veux aussi pouvoir l'invoquer depuis les differents QMainWindow après 15mn d'inactivité. Merci

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

    Désolé pour le délai de réponse, mais avec un code de 100 lignes qu'on ne peut pas exécuter à cause des importations, ce n'est pas facile...

    Dans la fenêtre Login, dès qu'on met un peu partout ".connect(self.close)", on engage la fermeture de la fenêtre, en arrivant à la dernière étape qui est "closeEvent". A noter qu'on arrivera aussi dans closeEvent en cliquant sur la croix de la fenêtre. La seule manière d'éviter la fermeture de la fenêtre dans closeEvent est de la refuser avec "event.ignore()". Mais si on passe par "event.accept(), c'est fini, et je ne vois pas comment la faire réapparaître après 15mn d'inactivité.

    Conclusion: comme je le suggérais, il faut utiliser hide et non close. Il faut diriger les 3 .connect(...) (=les 2 QLineEdit et le bouton) vers un méthode à créer "fin" par exemple.

    Après, on peut dans cette méthode "fin" fermer la fenêtre avec self.close(), ou la cacher provisoirement avec self.hide() pour la faire réapparaître plus tard avec self.show().

    Je suggère un petit coup d'œil dans la notice sur hide (c'est la notice de PyQt5, je n'ai plus celle de PyQt4):

    Hides the widget. This function is equivalent to setVisible(false).

    Note: If you are working with QDialog or its subclasses and you invoke the show() function after this function, the dialog will be displayed in its original position.

    See also hideEvent(), isHidden(), show(), setVisible(), isVisible(), and close().
    A noter qu'on peut à tout moment tester pour savoir si la fenêtre est visible ou pas.

    Pour que le ré-affichage de la fenêtre de login puisse être fait à partir des QMainWindows, il faut bien sûr que sa variable d'instance cnx soit accessible à l'intérieur de ces QMainWindow, ce que la seule importation ne permettra pas!

    J'en profite pour signaler que la solution des importations "attrape-tout" avec une étoile n'est vraiment pas conseillée.
    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 du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Points : 41
    Points
    41
    Billets dans le blog
    1
    Par défaut
    Merci pour la réponse et le temps que vous m'avez consacré. Je vais en abuser en demandant ce que je dois faire de façon optimale pour atteindre mes objectifs en omettant le retour à l'écran de connection. Merci

  6. #6
    Membre du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Points : 41
    Points
    41
    Billets dans le blog
    1
    Par défaut
    J'y suis presque. En suivant l'astuce donné dans le billé que j'ai cité en premier et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app.setQuitOnLastWindowClosed(False)
    et avec hide, j'arrive à faire ce que je veux mais le petit hic, c'est lorsque je ferme la fenêtre principale, l'application ne se termine pas; que dois-je faire dans ce cas pour terminer l'application? Merci

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 465
    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 465
    Points : 9 257
    Points
    9 257
    Billets dans le blog
    6
    Par défaut
    Je ne sais pas si mon expérience coïncide avec l'architecture visée, mais j'ai déjà eu un logiciel qui démarrait avec une fenêtre de login.

    Pour ce logiciel, je ne lance pas la fenêtre de login d'abord, mais la fenêtre principale de l'application (QMainLogin ou QWidget) sans l'afficher (donc, sans le .show()) et c'est cette fenêtre principale qui lance et exploite la fenêtre de login. Dans ce cas, la fermeture de cette fenêtre principale (qui n'a pas de parent), permet d'arrêter le logiciel.
    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
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Une fenêtre de dialogue reste une fenêtre de dialogue: on peut la lancer quand on veut, elle est détruite à la sortie et on pourra la recréer plus tard.
    Pour ce que j'ai compris du besoin, j'écrirai une chose comme çà:
    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
     
    from PyQt4 import QtGui
    from PyQt4.QtCore import QEvent, QTimer, Qt
    import time
     
    class QApplication(QtGui.QApplication):
        timestamp = None
        def notify (self, receiver, event):
            if event.type() in [ QEvent.MouseMove, QEvent.KeyPress ]:
               self.timestamp = time.time()
            return super().notify(receiver, event);
     
    class Login(QtGui.QDialog):
        def __init__(self, parent=None, username=None):
            super(Login, self).__init__(parent)
            self.username = QtGui.QLineEdit(self)
            if username:
                self.username.insert(username)
            self.password = QtGui.QLineEdit(self)
            self.button = QtGui.QPushButton('Login', self)
            self.button.clicked.connect(self.on_login)
            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(self.username)
            layout.addWidget(self.password)
            layout.addWidget(self.button)
     
        def on_login(self):
            if (self.username.text() == 'foo' and
                self.password.text() == 'bar'):
                self.accept()
            else:
                QtGui.QMessageBox.warning(
                    self, 'Error', 'Bad user or password')
     
    class Window(QtGui.QMainWindow):
        def __init__(self, parent=None):
            super(Window, self).__init__(parent)
     
    if __name__ == '__main__':
     
        app = QApplication([])
     
        timeout = 5
        def idletick():
            global timeout
            if time.time() - app.timestamp < 1.5:
                timeout = 5
            else:
                timeout -= 1
            if timeout < 0:
                idletimer.stop()
     
                login = Login(None, username)
                result = login.exec_()
                assert result == QtGui.QDialog.Accepted
                idletimer.start(1000)
     
     
        login = Login()        
        if login.exec_() == QtGui.QDialog.Accepted:
            idletimer = QTimer()    
            idletimer.timeout.connect(idletick) 
            username = login.username.text()
            idletimer.start(1000)
     
            window = Window()
            window.show()
            app.exec_()
    Ca fait le login, le démarrage de l'application et la demande de reconnexion après 5s. d'inactivité.
    Bon courage,

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

  9. #9
    Membre du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Points : 41
    Points
    41
    Billets dans le blog
    1
    Par défaut
    Bonsoir, cette solution m'aide beaucoup dans la résolution de la reconnexion, mais pouvez-vous me dire à quoi sert les chifrres des temps pour que je puisse modifier aux besoins?
    Citation Envoyé par wiztricks Voir le message

    timeout = 5
    def idletick():
    global timeout
    if time.time() - app.timestamp < 1.5:
    timeout = 5
    else:
    timeout -= 1
    if timeout < 0:
    idletimer.stop()

    login = Login(None, username)
    result = login.exec_()
    assert result == QtGui.QDialog.Accepted
    idletimer.start(1000)
    Merci

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par kekule10 Voir le message
    Bonsoir, cette solution m'aide beaucoup dans la résolution de la reconnexion, mais pouvez-vous me dire à quoi sert les chifrres des temps pour que je puisse modifier aux besoins?
    timeout = 5 (secondes) : je ne vais pas attendre 15 mns pour tester.
    Pour le reste .timestamp stocke l'instant de la dernière entrée clavier, déplacement de souris. Si l'inactivité est < 1.5 on recommence à compter avec timeout = 5. Sinon on décompte 1 seconde, jusqu'à arriver à zéro i.e. le timeout.

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

  11. #11
    Membre du Club

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Points : 41
    Points
    41
    Billets dans le blog
    1
    Par défaut
    Merci à tous pour votre aide!

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

Discussions similaires

  1. Application avec multiples interfaces graphiques
    Par Boobatt dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 08/04/2007, 17h25
  2. Réponses: 4
    Dernier message: 30/03/2007, 16h27
  3. [XUBUNTU] Problème avec l'interface graphique de vnc
    Par sniperwolf79 dans le forum Ubuntu
    Réponses: 1
    Dernier message: 08/02/2007, 14h40
  4. probleme avec une interface graphique
    Par jibb2b dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 10/01/2007, 13h52
  5. Application avec plusieurs interfaces graphiques
    Par Morpheus2144 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 25/05/2006, 23h29

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