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 :

Fermer une fenêtre et en lancer une autre


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 7
    Par défaut Fermer une fenêtre et en lancer une autre
    Bonjour à toutes et à tous.. Alors voila j'ai un petit problème et j'aimerais bien que vous m'aidiez..

    Alors voila je suis en plein projet de fin d'étude et j'arrive presque la fin. Bref, je dois créer une interface graphique avec pyqt qui affiche des données récupérée depuis un code python.. Pour être plus clair il s'agit d'un système de contrôle d'accès. Donc, sans plus tarder voici mon problème:

    Je dois créer deux fenêtre.. une fenêtre d'accueil et une fenêtre qui affiche les info et un message disant "ACCESS GRANTED" ou "ACCESS DENIED".

    J'ai créé la seconde fenêtre avec QT Designer ( je ferais de même pour la première mais ce n'est pas ça mon problème) puis j'ai généré le code python avec la fameuse commande pyuic4 -o... ... . J'ai aussi réussi à paramétrer les labels de la fenêtre en fonction des données contenu dans le programme python principal. Ce que je voudrais faire c'est faire apparaître la fenêtre 1 par défaut puis et commander le lancement de la seconde fenêtre qu'après un événement déclencheur( qui n'est pas un bouton car la fenêtre ne contient que des labels). Donc l’événement déclencheur doit être une condition vérifiée dans le programme python principal.

    Pour mieux comprendre mon besoin voici un scénario:

    un employé passe devant un lecteur (RFID). le programme lis le code RFID (EPC) puis consulte la base de données pour vérifier si l’employé a le droit d'entrer. Donc par défaut, l'écran (LCD) Affiche la fenêtre d'accueil (Fenêtre 1) et quand l'employé passe son badge devant le lecteur (événement déclencheur) :

    1) Je ferme la fenêtre d'accueil.

    2) Je lance la seconde fenêtre.

    3) Je met un temps mort [time.sleep(Délai)]

    4) Je fait réapparaître la fenêtre 1.

    Je tiens à insister sur le fait que ma fenêtre ne contient que des labels ( texte et image )

    voici le code générée par la commande pyuic4 -o ... ... et que j'ai un légèrement modifier en ajouter un constructeur et des fonction à la classe de la fenêtre 2 (MainWindow):
    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
    # -*- coding: utf-8 -*-
    from PyQt4 import QtCore, QtGui
    from PyQt4.QtGui import *
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
     
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
     
    class Ui_MainWindow(QtGui.QMainWindow):
        def __init__(self):
            QtGui.QMainWindow.__init__(self)
            self.setupUi(self)
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(774, 349)
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
            self.label_pic = QtGui.QLabel(self.centralwidget)
            self.label_pic.setGeometry(QtCore.QRect(70, 140, 141, 131))
            self.label_pic.setText(_fromUtf8(""))
            self.label_pic.setPixmap(QtGui.QPixmap(_fromUtf8("une image.jpg")))
            self.label_pic.setScaledContents(True)
            self.label_pic.setObjectName(_fromUtf8("label_pic"))
            self.label_NomPre = QtGui.QLabel(self.centralwidget)
            self.label_NomPre.setGeometry(QtCore.QRect(420, 130, 161, 31))
            self.label_NomPre.setObjectName(_fromUtf8("label_NomPre"))
            self.label_Matricule = QtGui.QLabel(self.centralwidget)
            self.label_Matricule.setGeometry(QtCore.QRect(420, 180, 161, 31))
            self.label_Matricule.setObjectName(_fromUtf8("label_Matricule"))
            self.label_Access = QtGui.QLabel(self.centralwidget)
            self.label_Access.setGeometry(QtCore.QRect(250, 240, 341, 31))
            self.label_Access.setScaledContents(True)
            self.label_Access.setObjectName(_fromUtf8("label_Access"))
            self.label_NomPre_2 = QtGui.QLabel(self.centralwidget)
            self.label_NomPre_2.setGeometry(QtCore.QRect(240, 130, 161, 31))
            self.label_NomPre_2.setObjectName(_fromUtf8("label_NomPre_2"))
            self.label_Matricule_2 = QtGui.QLabel(self.centralwidget)
            self.label_Matricule_2.setGeometry(QtCore.QRect(240, 180, 161, 31))
            self.label_Matricule_2.setObjectName(_fromUtf8("label_Matricule_2"))
            self.label_pic_2 = QtGui.QLabel(self.centralwidget)
            self.label_pic_2.setGeometry(QtCore.QRect(610, 10, 141, 91))
            self.label_pic_2.setText(_fromUtf8(""))
            self.label_pic_2.setPixmap(QtGui.QPixmap(_fromUtf8("une image")))<br>
            self.label_pic_2.setScaledContents(True)
            self.label_pic_2.setObjectName(_fromUtf8("label_pic_2"))
            self.label_pic_3 = QtGui.QLabel(self.centralwidget)
            self.label_pic_3.setGeometry(QtCore.QRect(30, 20, 151, 81))
            self.label_pic_3.setText(_fromUtf8(""))
            self.label_pic_3.setPixmap(QtGui.QPixmap(_fromUtf8("une image")))
            self.label_pic_3.setScaledContents(True)
            self.label_pic_3.setObjectName(_fromUtf8("label_pic_3"))
            MainWindow.setCentralWidget(self.centralwidget)
            '''
            self.menubar = QtGui.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 774, 21))
            self.menubar.setObjectName(_fromUtf8("menubar"))
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtGui.QStatusBar(MainWindow)
            self.statusbar.setObjectName(_fromUtf8("statusbar"))
            MainWindow.setStatusBar(self.statusbar)
            '''
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
        def SetImage(self, pict):
            self.label_pic.setPixmap(QtGui.QPixmap(_fromUtf8(pict)))
            """self.label_pic_2.setPixmap(QtGui.QPixmap(_fromUtf8("Logo INDUS.png")))
            self.label_pic_3.setPixmap(QtGui.QPixmap(_fromUtf8("TIScircuits.png")))"""
     
        def SetNomPre(self, NP):
            self.label_NomPre.setText(_fromUtf8(NP))
     
        def SetMat(self, Mat):
            self.label_Matricule.setText(_fromUtf8(Mat))
     
        def SetAccess(self, Access):
            self.label_Access.setText(_fromUtf8(Access))
     
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
            self.label_NomPre.setText(_translate("MainWindow", "Hellonompre", None))
            self.label_Matricule.setText(_translate("MainWindow", "Hellomatricule", None))
            self.label_Access.setText(_translate("MainWindow", "Helloaccess", None))
            self.label_NomPre_2.setText(_translate("MainWindow", "Nom & Prénom", None))
            self.label_Matricule_2.setText(_translate("MainWindow", "Matricule", None))
    et voici le programme main ( Veuillez sauter à la partie qui nous intéresse dans ce sujet, elle est tout en bas et est encadrée par des #, le reste du programme n'est pas important, du moins pour vous)

    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
    # -*- coding: utf-8 -*-
    from PyQt4 import QtCore, QtGui
    from PyQt4.QtGui import *
    import sys, pyodbc, serial
    import RFID_MW as mw
    from os import chdir
    import os
    import time
    #Variables
    Code_Zone = "d"
    EPC_Code = "ce nest pas important"
    Pics_Dir = "ce nest pas important"
    OK = "Access Granted"
    NotOk = "Access Denied"
    BG1 = "BG1.jpg"
    if __name__=='__main__':
     
        # GETTING RFID CODE
        ser = serial.Serial(port='COM6', baudrate=115200)    # Windows connection
        a = ser.read(19).encode('hex')
        if (len(a)==38):
            EPC_Code = a[14:]
            print ('EPC is : ' + EPC_Code)
        else:
            continue
        ser.close()
     
        #DB CONNECTION
        cnxn = """DRIVER={ce nest pas important};SERVER=ce nest pas important;PORT=ce nest pas important;UID=ce nest pas important;PWD=ce nest pas important;DATABASE=ce nest pas important"""
        db_connection = pyodbc.connect(cnxn)
        print ('Connected TO DB')
        sql_command = "SELECT [ce nest pas important] FROM [ce nest pas important].[ce nest pas important].[table] WHERE [empl_rfid]= ""ce nest pas important""
        db_cursor = db_connection.cursor()
        db_cursor.execute(sql_command)
        rows = db_cursor.fetchone()
        result= str(rows[0])
        NomPre = str(rows[1])
        Matricule = str(rows[2])
        print result
        print NomPre
        print Matricule
        chdir(Pics_Dir) # cd to the picture's directory
        x= os.getcwd()
        print x
     
    # GUI : C'est cette partie qui la plus importante pour ce sujet. Le reste ne l'est pas, du moins pour vous  !!
     
    ###############################################################################################################################
        im2 = Matricule+".jpg"
        app = QtGui.QApplication(sys.argv)   
        ex = mw.Ui_MainWindow()
        palette = QPalette()
        palette.setBrush(QPalette.Background,QBrush(QPixmap("BG1.jpg")))
        ex.setPalette(palette)
        ex.SetImage(im2)
        ex.SetNomPre(NomPre)
        ex.SetMat(Matricule)
        if result =='True':
            print (OK)
            ex.SetAccess(OK)
        else:
            print(NotOk)
            ex.SetAccess(NotOk)
     
        #ex.showFullScreen()
        ex.show()
        sys.exit(app.exec_())
    ###########################################################################################
    j'espère avoir était clair et j'espère que vous pourrez m'aider. Je vous en saurez grès !

  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,

    Afficher des fenêtres, donc des widgets succéssifs n'est pas un problème, la question qui se pose ici c'est que la boucle d'attente du programme est en observation d'un évènement extérieur aux fenêtres.

    Je verrais plutôt quelque chose comme ceci:
    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
     
    from accueil import Accueil   # fenêtre de base
    from access import Access     # fenêtre d'identification
     
    class Main(object):
        def __init__(self):
            self.accueil = Accueil()
            self.accueil.show()
     
            self.access = Access()
     
        def wait(self):
            # boucle d'attente sur le lecteur RFID
            # saisie des paramètres sur le lecteur en cas de lecture
            self.on_event(params)
     
        def on_event(self, data):
            # vérification des données
            # si OK
                self.access.label.setText('Bienvenue madame Machin')
            # si pas OK
                self.access.label.setText('identification non valide')
            self.toggle_widget(True)
            time.sleep(2)
            self.toggle_widget(False)
     
        def toggle_widget(self, b):
            self.accueil.setVisible(not b)
            self.access.setVisible(b)
     
     
    if __name__=='__main__':
        app = QtGui.QApplication(sys.argv)
        main = Main()
        main.wait()
        sys.exit(app.exec_())

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 7
    Par défaut
    Bonjour VinsS, merci d'avoir rapidement répondu mais je t'avoue que je n'ai pas tout à fait compris. Ce que j'ai pas dit c'est que malgré les apparences, je suis débutant en PyQt. est ce que tu pourrait m'expliquer le code que t'as mis plus en détail et surtout les fonctions. Ensuite, j’essaierai de l'adapter à mes besoins. Si c'est possible, tu pourrais aussi me donner un petit exemple bien commenté. ça m'aiderai beaucoup.
    Merci d'avance.

  4. #4
    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
    Le problème initial de ton code est que c'est un one-shot.

    Tu fais, au lancement du code une lecture du port série ensuite une vérification avec la base de données et puis tu crées ta fenêtre.

    Et puis ensuite, qu'advient-il des signaux du lecteur RFID ? Il faut que tu le lises en boucle, non ?

    Je pars du principe que tu connais ce genre de lecteur, moi pas, je ne pourrai pas de renseigner.

    Donc, ton programme principal, Main() instancie les deux fenêtres nécessaires et affiche la première (__init__()) ensuite il se met en attente (wait()) pour le lecteur RFID. Par exemple dans une boucle while qui vérifie le port série toutes les x secondes.

    Lorsqu'une demande d'accès se produit la méthode on_event() est appelée en lui communicant les données du lecteur, ces données sont contrôlées et il reste à mettre à jour le QLabel de la deuxième fenêtre selon accès autorisé ou non puis on l'affiche.

    Pour cacher une fenêtre et afficher l'autre on appelle toggle_widget()

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 7
    Par défaut
    Je te remercie VinsS.. J'ai bien compris et concernant le lecteur, il est en lecture continue donc l’événement déclencheur sera la consultation de la base mais c'est pas important pour le moment, je verrais plus ça plus tard. Sinon, je te remercie également d'avoir tarder à répondre car ça m'as permis de me casser la tête à comprendre ton code en faisant divers test et au moment où j'ai compris comme je dois faire, t'as répondu..Enfin, Bref.. Merci pour tes explications supplémentaire.. jv'ai essayé d'appliquer le truc sur mon code (ça va prendre un peu de temps vu que je suis débutant) et puis quand j'aurais fini je marquerais le sujet résolu.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 7
    Par défaut
    Rebonjour ou plutôt bonsoir, non le problème n'est pas résolu car la y'a bien une fenêtre qui apparaît au début puis une autre apparaît pour remplacer la première mais la contenu de la première fenêtre n'apparaît qu'après l'apparition de la seconde fenêtre. et puis pour être franc avec toi vinsS j'ai toujours pas compris ces deux méthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        def wait(self):
            # boucle d'attente sur le lecteur RFID
            # saisie des paramètres sur le lecteur en cas de lecture
            self.on_event(params)
     
        def on_event(self, data):
            # vérification des données
            # si OK
                self.access.label.setText('Bienvenue madame Machin')
            # si pas OK
                self.access.label.setText('identification non valide')
            self.toggle_widget(True)
            time.sleep(2)
            self.toggle_widget(False)

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/05/2012, 14h35
  2. Comment fermer une fenêtre et en appeler une autre ?
    Par vg-matrix dans le forum Débuter
    Réponses: 6
    Dernier message: 06/02/2008, 16h14
  3. Fermer une fenêtre et en ouvrir une autre
    Par Ekarisor dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 25/11/2007, 19h59
  4. fermer une fenêtre et en ouvrir une autre
    Par edson15 dans le forum Windows
    Réponses: 1
    Dernier message: 03/06/2007, 10h44
  5. [SWT] Lancer une fenêtre SWT depuis une autre
    Par sunvialley dans le forum SWT/JFace
    Réponses: 12
    Dernier message: 21/04/2006, 17h22

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