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

Contribuez Python Discussion :

Comment neutraliser des messages de warning de Qt en PyQt4


Sujet :

Contribuez Python

  1. #1
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut Comment neutraliser des messages de warning de Qt en PyQt4
    Bonjour,

    Dans le cadre d'un développement en PyQt4 utilisant QtWebKit.QWebView, j'avais en chargeant certains sites, par exemple celui d'adobe, un message d'alerte (warning) sur la console du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QFont::setPixelSize: Pixel size <= 0 (0)
    Bon. Ce n'est pas grave, ce n'est qu'un warning. Mais c'est irritant parce que c'est inutile. Et si on diffuse le programme, cela peut jeter un doute sur le sérieux du développement.

    Alors, j'ai cherché comment éviter cela. J'ai bien trouvé quelques exemples en cpp, mais pas en Python. J'ai fini par mettre au point une solution: le code suit (Python 2.7 - PyQt4):

    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
    import sys
    from PyQt4 import QtCore, QtGui
     
    def messagederreur(msgtyp, msg):
        """permet d'afficher ou non dans la console les messages d'erreur de Qt
           mise en place par: QtCore.qInstallMsgHandler(messagederreur)
        """ 
        if msgtyp==QtCore.QtDebugMsg:
            print("Debug: %s\n" % (msg,))
     
        elif msgtyp==QtCore.QtWarningMsg:
            # exemple de désactivation d'un message donné par QWebKit.QWebView
            if msg!="QFont::setPixelSize: Pixel size <= 0 (0)":
                print("Warning: %s\n" % (msg,))
     
        elif msgtyp==QtCore.QtCriticalMsg:
            print("Critical: %s\n" % (msg,))
     
        elif msgtyp==QtCore.QtFatalMsg:
            print("Fatal: %s\n" % (msg))
            sys.exit()
    On installe le traitement des messages au début de l'exécution par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.qInstallMsgHandler(messagederreur)
    Ceci au tout début du lancement de la bibliothèque (app = QtGui.QApplication(sys.argv))

    Et ce message de warning disparait de la console.

    On peut, bien sûr, adapter le code pour neutraliser d'autres messages de warning, voire tous, mais il faut bien réfléchir avant, parce que certains messages nécessitent effectivement des corrections du code.

    Cela devrait aussi fonctionner en Python 3.x. Je n'ai pas essayé en PySide, mais comme c'est une machinerie de Qt, je suppose que ça marchera aussi. Quand à Qt5: à voir.
    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

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Quite a... autant créer un logger du module de logging appelé "QtCore" et lui re-balancer les messages d'erreurs (a la place de faire des "print").
    Par défaut, le module logging n'est pas charge et les messages vont nulle part.
    Si le module de logging est charge, on pourra "filtrer" le niveau de messages expédies au logger "QtCore".
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

    J'ai pensé au "print" tout naturellement, puisque les messages n'arrivent qu'en console. Et ma solution est très simple et atteint l'objectif visé.

    Merci pour ton idée de solution, mais je ne l'ai pas trouvée: rien qui ne match avec "logging" ou "logger" dans QtCore. Ce ne serait pas plutôt "QML"?

    Tu peux me donner des compléments d'info?
    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

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut Tyrtamos,

    Le module logging est livre en standard avec Python.
    Créer un logger se fait via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import logging
    log = logging.getLogger('QtCore')
    Après, il suffit de remplacer les "print":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    map = { QtCore.QtDebugMsg: log.debug,
       QtCore.QtWarningMsg: log.warn,
       ....
    }
    def messagederreur(msgtyp, msg):
          map[msgtyp](msg)
    Tant qu'on ne fait rien "par ailleurs", ça n'affichera rien.
    On a juste mis en place une machinerie utilisable "par ailleurs".

    Dans le module principal, on peut démarrer les bavardages du logging, via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import logging
    logging.basicConfig(level=logging.DEBUG)
    Puis pour le logger nomme 'QtCore', si on ne veut sortir que les "warn":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    log = logging.getLogger('QtCore')
    log.setLevel(logging.WARN)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Merci wiztricks!

    J'avais mal compris: je pensais qu'il y avait un "logging" dans QtCore.
    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

Discussions similaires

  1. comment renvoyer des messages
    Par AlexFred dans le forum Outlook
    Réponses: 1
    Dernier message: 25/09/2007, 13h13
  2. Comment envoyer des messages
    Par loïc31baground dans le forum C
    Réponses: 9
    Dernier message: 26/08/2007, 20h46
  3. [SQL2K][DTS]Comment ecrire des messages de traces
    Par fchenebit dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/07/2006, 11h29
  4. [Struts] Comment afficher des messages de confirmation
    Par vallica dans le forum Struts 1
    Réponses: 8
    Dernier message: 28/04/2006, 15h25

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