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 :

[QtWebEngineView] Fenêtre Url s'ouvre et se ferme de suite


Sujet :

PyQt Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut [QtWebEngineView] Fenêtre Url s'ouvre et se ferme de suite
    Bonjour,

    Jeune novice en développement python, je suis en panne sèche sur le problème suivant.
    Je suis sous Windows 10 64bits.
    Je travaille avec python v3.7.3 - PyQt5 v5.14.2 - Qt Designer v5.14.1 - QtWebEngine v5.14.

    Je souhaite créer une fonction qui permet d'ouvrir un fichier .html : aide.html.
    Cette fonction est liée à un sous-menu QAction créé via Qt Designer.
    J'ai un fichier .py contenant l'IHM et les liens entre boutons/menu/sous-menus et fonctions associées. Ce fichier IHM importe les fonctions depuis un autre fichier .py nommé modules.
    Lorsque je clique sur mon QAction "Aide", la fenêtre devant faire apparaitre le contenu du fichier html s'ouvre et se ferme de suite : je n'ai aucun message d'erreur.
    Voici le code de ma fonction
    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
     
    #Import des librairies nécessaire au fonctionnement des fonctions ci-dessous
    #
    ####################################################################################################################
     
    import os , sys
     
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    from PyQt5.QtWebEngineWidgets import QWebEngineView
     
    ####################################################################################################################
    #
    # Fonctions des modules de l'IHM
    #
    ####################################################################################################################
     
    # Fonction d'ouverture du Menu Aide (Guide Utilisateur au format html)
    def ouvrirAide():
      html = QWebEngineView()
      file_path = os.path.abspath("aide.html")
      print(file_path)
      local_url = QUrl.fromLocalFile(file_path)
      print("chemin complet du fichier => ",local_url)
      html.load(local_url)
      html.show()
    Je suis preneur de toute piste et/ou aide pour enfin visualiser mon fichier aide.html.
    D'avance merci pour l'aide que vous pourrez me donner.

  2. #2
    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,

    C'est normal: les variables que tu crées dans ta fonction sont locales à cette fonction et sont détruites une fois cette fonction terminée (juste après html.show()). Et n'oublie pas que les IHM fonctionnent par gestion d'évènements: l'affichage d'une fenêtre signifie que le programme attend l'utilisateur pour savoir ce qu'il doit faire.

    Si tu ne passes pas un peu de temps avec un bon tuto, tu vas passer un temps fou à développer ton projet...
    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
    Futur Membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour Tyrtamos,

    Merci pour l'explication. Cette explication m'éclaircit un peu mon problème même si je ne vois pas sur quel chemin m'orienter pour faire fonctionner cette fonction.
    J'avais choisi cette méthode car j'ai la même organisation en PyQt4 qui fonctionne.

    Effectivement avec un bon tuto, je pourrai gagner du temps mais hélas très difficile à trouver sur le Net vu la multitude de tuto et autres dispo.

    Si tu as un tuto à me conseiller et des pistes de code : je suis preneur.

    Bon confinement.

  4. #4
    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,

    Pour un bon tuto concernant Python, celui de Gérard Swinnen:

    https://python.developpez.com/cours/apprendre-python3/

    Pour PyQt5: je ne connais pas de tuto. Je travaille avec la doc de riverbank et celle de Qt5. Plus, bien sûr, de nombreuses recherches google!

    Pour un code d'affichage de page html d'aide, en voici un:

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    import os
    from PyQt5 import QtWidgets, QtCore, QtWebEngineWidgets
     
    ##############################################################################
    class WebEnginePage(QtWebEngineWidgets.QWebEnginePage):
        """Nécessaire pour permettre à un lien hypertexte d'afficher une nouvelle 
           page dans la même fenêtre
           Voir ici: 
           https://stackoverflow.com/questions/54920726/how-make-any-link-blank-open-in-same-window-using-qwebengine
        """
        #=========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
        #=========================================================================
        def createWindow(self, _type):
            page = WebEnginePage(self)
            page.urlChanged.connect(self.on_url_changed)
            return page
     
        #=========================================================================
        def on_url_changed(self, url):
            page = self.sender()
            self.setUrl(url)
            page.deleteLater()
     
    #############################################################################
    class AideHtml(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.setWindowTitle("Aide")
            self.resize(1000, 600)
     
            # crée l'afficheur de page html
            self.view = QtWebEngineWidgets.QWebEngineView()
     
            # positionne la page html dans la fenêtre
            self.layout = QtWidgets.QGridLayout(self)
            self.layout.addWidget(self.view)
            self.setLayout(self.layout)
     
            # prépare le chargement de la page
            self.page = WebEnginePage(self.view) # => QWebEnginePage personnalisé
            self.view.setPage(self.page)
     
        #========================================================================
        def affichepage(self, url, ancre=None):
            """affiche la page d'adresse 'url' (ancre possible si != de None)
               url peut être un fichier html local ou une adresse web
            """
            # définit si c'est une page locale ou non
            if os.path.exists(url):
                # => c'est un fichier local
                qurl = QtCore.QUrl.fromLocalFile(url)
            else:
                # => c'est une adresse web
                qurl = QtCore.QUrl(url)
     
            # charge la page
            self.page.setUrl(qurl)
            self.view.setPage(self.page)
     
            # injecte du javascript pour accéder, si demandé,  à une ancre de la page
            if ancre!=None:
                # crée un QWebEngineScript pour porter le script javascript
                qscript = QtWebEngineWidgets.QWebEngineScript()
                # fait que le script ne sera injecté qu'à la fin du chargement de la page
                qscript.setInjectionPoint(QtWebEngineWidgets.QWebEngineScript.Deferred)
                # code source du script javascript
                scriptjs = """
                window.location.hash = "{}"
                """.format(ancre)
                # charge le code source du script
                qscript.setSourceCode(scriptjs)
                # exécute le script à la fin du chargement de la page
                self.view.page().profile().scripts().insert(qscript)
     
    #############################################################################
    if __name__ == '__main__':
     
        app = QtWidgets.QApplication(sys.argv)
     
        aide = AideHtml()
        aide.show()
     
        fichieraide = os.path.abspath("aide.html")
        ancre = "partiecommune" # permet d'afficher la page sur l'ancre "#partiecommune"
        aide.affichepage(fichieraide, ancre)
     
        sys.exit(app.exec_())
    Tu vois qu'il y a un QWebEnginePage personnalisé: il n'est nécessaire que pour qu'un lien hypertexte puisse télécharger une nouvelle page dans la même fenêtre.

    On peut afficher une page html locale (fichier d'aide par exemple), en ajoutant si nécessaire une "ancre" permettant une aide "contextuelle": on affiche alors directement la partie pertinente de la page au moment de l'appel de l'aide.

    Les liens hypertextes internes à la page html (=> ancre) fonctionnent, mais aussi les liens externes pour un autre fichier html et même une page web (type "https://www.google.fr").

    Un clic droit permet d'afficher un menu popup pour le retour à la page précédente, le rechargement de la page, et même l'affichage du code source html. L'enregistrement de la page ne marche pas dans cette version simplifiée. On pourrait, bien sûr, créer un menu popup plus riche et en français si c'était nécessaire.

    Et rien n'empêche d'afficher directement une page web, y compris celle du présent forum: "https://www.developpez.net/forums/f96/autres-langages/python/". Mais je ne sais pas ce que ça donne sur le plan sécurité. Il faudrait en faire beaucoup plus pour obtenir un "vrai" navigateur. Il faudrait aussi ajouter une barre d'outils, une ligne de messages, etc... ce qui dépasse la présente question.

    En tout cas, j'aime bien cette solution pour afficher un fichier html local. J'utilise ça très souvent pour les fichiers d'aide de mes programmes. J'édite ces fichiers html avec le logiciel gratuit "BlueGriffon" qui marche très bien pour ça!
    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
    Futur Membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour Tyrtamos,

    Merci beaucoup pour ce cours accélérée et cet exemple de code.
    Je vais mettre tout cela dans mon cahier d'écolier et travailler sur le code que tu m'as donné.
    Je reviens vers toi en cas de doute ou d'incompréhension.

    Bon confinement.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2020
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Aide html enfin visible
    Bonjour tyrtamos,

    Désolé pour ce retard, mais je tenais à te remercier.
    Avec tes indications et un peu d'huile de coude j'ai réussi à faire fonctionner mon aide.html.

    Comme je ne voulais pas créer une nouvelle classe et tout concentrer dans une fonction, il m'a suffit d'ajouter un grid pour que le fichier html s'affiche.
    Je peux me concentrer sur mes nouveaux problèmes python maintenant.

    A+

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

Discussions similaires

  1. xmule: s'ouvre et se ferme de suite ?
    Par nuglus dans le forum Mandriva / Mageia
    Réponses: 12
    Dernier message: 22/12/2006, 10h52
  2. Réponses: 10
    Dernier message: 09/11/2006, 17h07
  3. Fenêtre console qui ouvre toujours
    Par sawbo1 dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 23/05/2006, 21h27
  4. fenètre qui s'ouvre avec un bouton formulaire
    Par nickg dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/02/2006, 22h54
  5. Fenêtre qui s'ouvre au démarrage
    Par Ender dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 20/09/2005, 09h38

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