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 :

Comment savoir si l'application Qt est bien lancée ?


Sujet :

PyQt Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Comment savoir si l'application Qt est bien lancée ?
    Bonjour,

    dans le cadre de notre projet de calibration de caméra par un écran LCD, on a développé une application PyQt qui ne contient qu'une mainwindow et un label.
    A l'init de la mainwindow on applique une image au label. Voici le code de la classe :

    class MainWindow(QMainWindow):
    def __init__(self, left, top, path):
    QMainWindow.__init__(self, None, Qt.FramelessWindowHint)
    self.main_frame = QFrame(self)
    self.label = ClickableImageQLabel(self.main_frame)
    self.setCentralWidget(self.label)

    self.label.clicked.connect(self.close)

    self.setPosition(left, top, 0, 0)

    self.setImage(path)


    Puis dans le main du script python, on fait ceci :

    app = QApplication(sys.argv)
    main_window = MainWindow(left, top, path)
    main_window.show()
    ret = app.exec_()
    # remove pid-file before exit.
    removePIDfile()
    sys.exit(ret)

    J'ai fait le test de mettre un timer entre main_window.show() et ret = app.exec_()
    J'ai remarqué que j'avais ma fenêtre d'ouverte pendant la durée de mon timer mais avec un fond gris et pas d'image.
    Une fois le timer terminé, l'image apparait.

    Ce script python va être lancé depuis un autre script qui servira de wrapper, afin de rendre la main uniquement si la fenêtre est affiché et l'image aussi.

    Comment je peux me garantir que l'image est bien affiché dans la fenêtre de mon application avant de rendre la main pour la suite du process, c'est à dire l'acquisition de l'image ?

    Car j'ai eu quelques fois une acquisition caméra alors que l'image n'était pas encore complètement affichée.

    Je rajouterai un timer de 20ms après que le script m'ait rendu la main, afin de laisser le temps à l'écran de se rafraichir.

    Merci
    Sylvain

  2. #2
    Expert éminent

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

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

    Juste après main_window.show() rajoute ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QtCore.QCoreApplication.processEvents()
    et si tu tiens à utiliser un timer, utilise le threading.Timer de préférence, il n'est pas bloquant.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Non le timer c'était pour expliquer mon problème ...

    C'est ce que j'ai fini par trouver en cherchant.

    Y faire appel une seule fois ne change rien, par contre y faire appel plusieurs fois via une boucle for résout mon problème.
    Ça m'aide bien, tout fonctionne comme je veux maintenant, mais je trouve ça pas propre, et j'ai l'impression de pas maitriser ce que je fais.

    Pour l'instant je laisse comme ça, mais si une autre solution existe .... je suis preneur.


    Merci pour ta réponse

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    En fait l'appel à processEvent est un processus courant, ça n'a rien de "pas propre", en général les frameworks graphiques attendent d'être revenus dans la boucle d'événements pour rafraîchir l'affichage. Ceci pour des questions de performances.

    Dans le cas d'animation, par exemple on doit sans cesse faire faire appel à processEvent sans quoi on ne peut voir que la fin de l'animation en question.

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par VinsS Voir le message
    En fait l'appel à processEvent est un processus courant, ça n'a rien de "pas propre", en général les frameworks graphiques attendent d'être revenus dans la boucle d'événements pour rafraîchir l'affichage. Ceci pour des questions de performances.

    Dans le cas d'animation, par exemple on doit sans cesse faire faire appel à processEvent sans quoi on ne peut voir que la fin de l'animation en question.
    Je ne dis pas que l'appel à processEvent n'est pas propre.

    Je dis que ma boucle d'appel à processEvent qui suit n'est pas propre :
    for i in xrange(1000):
    app.processEvents()

    Pourquoi 1000, parce que 10 c'était pas, bon, 100 non plus et 1000 oui.

    C'est ça que j'aime pas dans mon code, car je sais pas pourquoi 1000 ?

    Si autant d'appels n’ont pas d’impact, j'accepte de garder ce code. Il corrige mon problème.

  6. #6
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Dans ce cas ce n'est pas bon alors.

    Un seul processEvents doit suffire.

    Ton code n'est pas complet, il doit y avoir quelque chose qui dure longtemps, peut-être setImage(path) ?

    Sinon insère des print pour voir à partir de quelles lignes de code ça coince.

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

    Moi, c'est le code du 1er message qui me surprend. Si l'image doit être dans le label, il faudrait self.label.setPicture(path) ou quelque chose comme ça.

    A noter que sans les indentations, c'est difficile à lire: il faut utiliser les tag de code (le '#' de l'éditeur de message).

    Souhaites-tu un code d'exemple?
    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
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai peut-être oublié de donner cette partie du code pour l'histoire du label :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class ClickableImageQLabel(QLabel):
        def __init(self, parent):
            QLabel.__init__(self, parent)
            self.setLineWidth(0)
     
        clicked = pyqtSignal()
     
        def mouseReleaseEvent(self, ev):
            self.clicked.emit()
     
        def setImage(self, path):
            self.pixmap = QPixmap(path)
            self.setPixmap(self.pixmap)

  9. #9
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Alors dans ce cas, dans la classe MainWindow ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.setImage(path)
    mais ça doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.label.setImage(path)

Discussions similaires

  1. [PDO] Comment savoir si ma requête s'est bien exécutée ?
    Par Neewd dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/04/2013, 20h30
  2. Comment savoir si ma page web est bien affiché ?
    Par Borowsky dans le forum Langage
    Réponses: 1
    Dernier message: 03/02/2010, 17h07
  3. Comment savoir si une requete c'est bien passé
    Par choubak dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/07/2007, 15h26
  4. Réponses: 6
    Dernier message: 12/09/2006, 11h08
  5. Comment savoir si une impression s'est bien déroulé?
    Par Cyrilh7 dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/11/2003, 20h49

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