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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    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 : 43
    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
    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 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,

    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
    Membre à l'essai
    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 : 43
    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
    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 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
    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
    Membre à l'essai
    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 : 43
    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
    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 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
    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.

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