Ci-dessous, les différences entre deux révisions de la page.
— |
pyqt4_navigateur_web [2013/09/13 10:55] (Version actuelle) tyrtamos créée |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | |||
+ | |||
+ | En construction! | ||
+ | |||
+ | |||
+ | <code python> | ||
+ | # | ||
+ | # -*- coding: utf-8 -*- | ||
+ | from __future__ import division | ||
+ | #Python 2.7 | ||
+ | |||
+ | __logiciel__ = u" | ||
+ | __version__ = u" | ||
+ | __date__ = u" | ||
+ | |||
+ | import os, sys | ||
+ | from functools import partial | ||
+ | |||
+ | from PyQt4 import QtCore, QtGui, QtNetwork, QtWebKit | ||
+ | from apropos import Apropos | ||
+ | |||
+ | ############################################################################# | ||
+ | class Navigateurweb(QtGui.QMainWindow): | ||
+ | """ | ||
+ | |||
+ | # ======================================================================= | ||
+ | def __init__(self, | ||
+ | """ | ||
+ | super(Navigateurweb, | ||
+ | |||
+ | # met le titre de la fenêtre | ||
+ | self.setWindowTitle(u" | ||
+ | # affiche l' | ||
+ | if self.windowIcon().isNull(): | ||
+ | # mettre ici l' | ||
+ | # | ||
+ | pass | ||
+ | # stocke la page ' | ||
+ | self.urlblank = QtCore.QUrl(u" | ||
+ | if url==None: | ||
+ | self.urlhome = self.urlblank | ||
+ | else: | ||
+ | self.urlhome = self.corrigeurl(url) | ||
+ | | ||
+ | # fichier pdf dans lequel l' | ||
+ | if imprimepdf==None: | ||
+ | home = os.path.expanduser(" | ||
+ | fichier = u" | ||
+ | self.imprimepdf = os.path.join(home, | ||
+ | else: | ||
+ | self.imprimepdf = os.path.abspath(os.path.expanduser(imprimepdf)) | ||
+ | | ||
+ | # répertoire par défaut dans lequel on va chercher les fichiers html | ||
+ | self.repdefaut = os.path.abspath(os.path.expanduser(repdefaut)) | ||
+ | | ||
+ | | ||
+ | # fabrique le menu principal de la fenêtre | ||
+ | menubar = self.menuBar() | ||
+ | fileMenu = menubar.addMenu(' | ||
+ | | ||
+ | ouvrirAction = QtGui.QAction('& | ||
+ | ouvrirAction.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_O) | ||
+ | ouvrirAction.setStatusTip(u" | ||
+ | ouvrirAction.triggered.connect(self.ouvrir_m) | ||
+ | fileMenu.addAction(ouvrirAction) | ||
+ | | ||
+ | imprimerAction = QtGui.QAction('& | ||
+ | imprimerAction.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_I) | ||
+ | imprimerAction.setStatusTip(u" | ||
+ | imprimerAction.triggered.connect(self.imprimer_m) | ||
+ | fileMenu.addAction(imprimerAction) | ||
+ | | ||
+ | fileMenu.addSeparator() | ||
+ | | ||
+ | quitterAction = QtGui.QAction('& | ||
+ | quitterAction.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_Q) | ||
+ | quitterAction.setStatusTip(u" | ||
+ | quitterAction.triggered.connect(lambda : self.close()) | ||
+ | fileMenu.addAction(quitterAction) | ||
+ | |||
+ | aideMenu = menubar.addMenu(' | ||
+ | | ||
+ | aproposAction = QtGui.QAction('& | ||
+ | aproposAction.setStatusTip(u" | ||
+ | aproposAction.triggered.connect(self.apropos_m) | ||
+ | aideMenu.addAction(aproposAction) | ||
+ | | ||
+ | # crée le QWebView pour affichage des pages html | ||
+ | self.vuehtml = QtWebKit.QWebView() | ||
+ | | ||
+ | # configure viewhtml (interdire ' | ||
+ | reglage = self.vuehtml.settings() | ||
+ | # activer javascript | ||
+ | reglage.setAttribute(QtWebKit.QWebSettings.JavascriptEnabled, | ||
+ | reglage.setAttribute(QtWebKit.QWebSettings.JavascriptCanOpenWindows, | ||
+ | reglage.setAttribute(QtWebKit.QWebSettings.JavascriptCanAccessClipboard, | ||
+ | |||
+ | # activer les plugins | ||
+ | reglage.setAttribute(QtWebKit.QWebSettings.PluginsEnabled, | ||
+ | |||
+ | # fait que les couleurs et motifs de fond de page ne seront pas imprimés | ||
+ | reglage.setAttribute(QtWebKit.QWebSettings.PrintElementBackgrounds, | ||
+ | |||
+ | # connecte les évènements du QWebView avec les méthodes | ||
+ | self.vuehtml.loadProgress.connect(self.loadProgress_m) | ||
+ | self.vuehtml.loadFinished.connect(self.loadFinished_m) | ||
+ | self.vuehtml.linkClicked.connect(self.linkClicked_m) | ||
+ | self.vuehtml.urlChanged.connect(self.urlChanged_m) | ||
+ | | ||
+ | # crée la ligne de saisie des adresses des pages html (web ou disque) | ||
+ | self.adresse = QtGui.QLineEdit() | ||
+ | self.adresse.setSizePolicy(QtGui.QSizePolicy.Expanding, | ||
+ | | ||
+ | self.adresse.returnPressed.connect(self.returnPressed_m) | ||
+ | | ||
+ | # initialise la barre d' | ||
+ | self.toolBar = self.addToolBar(" | ||
+ | self.toolBar.addAction(self.vuehtml.pageAction(QtWebKit.QWebPage.Back)) | ||
+ | self.toolBar.addAction(self.vuehtml.pageAction(QtWebKit.QWebPage.Forward)) | ||
+ | self.toolBar.addAction(self.vuehtml.pageAction(QtWebKit.QWebPage.Reload)) | ||
+ | self.toolBar.addAction(self.vuehtml.pageAction(QtWebKit.QWebPage.Stop)) | ||
+ | self.toolBar.addWidget(self.adresse) | ||
+ | |||
+ | # initialisation de la barre de status (affiche le nom de page html) | ||
+ | self.statusBar().showMessage(u'' | ||
+ | | ||
+ | # positionne le QWebView dans la partie centrale de la fenêtre | ||
+ | self.setCentralWidget(QtGui.QFrame()) | ||
+ | posit = QtGui.QGridLayout() | ||
+ | posit.addWidget(self.vuehtml, | ||
+ | self.centralWidget().setLayout(posit) | ||
+ | | ||
+ | # permet les liens hypertexte | ||
+ | self.vuehtml.page().setLinkDelegationPolicy(QtWebKit.QWebPage.DelegateAllLinks) | ||
+ | | ||
+ | # met en place un nouveau menu popup du QWebView | ||
+ | self.vuehtml.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) | ||
+ | self.vuehtml.customContextMenuRequested.connect(self.popupmenuvuehtml) | ||
+ | | ||
+ | # met en place un nouveau menu popup pour la barre d' | ||
+ | self.toolBar.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) | ||
+ | self.toolBar.customContextMenuRequested.connect(self.popupmenutoolbar) | ||
+ | | ||
+ | # active la capacité de charger des pages https:// | ||
+ | # certif: https:// | ||
+ | config = QtNetwork.QSslConfiguration.defaultConfiguration() | ||
+ | certs=config.caCertificates() | ||
+ | certs.append(QtNetwork.QSslCertificate(QtCore.QFile(" | ||
+ | config.setCaCertificates(certs) | ||
+ | | ||
+ | # charge la page demandée au lancement | ||
+ | self.adresse.setText(self.urlhome.toString()) | ||
+ | self.returnPressed_m() | ||
+ | |||
+ | # met le focus sur la page affichée | ||
+ | self.vuehtml.setFocus() | ||
+ | | ||
+ | # ======================================================================= | ||
+ | def ouvrir_m(self): | ||
+ | """ | ||
+ | | ||
+ | fichier = QtGui.QFileDialog.getOpenFileName(self, | ||
+ | | ||
+ | | ||
+ | | ||
+ | fichier = unicode(fichier) | ||
+ | |||
+ | if fichier==u"": | ||
+ | return | ||
+ | |||
+ | # charge la page demandée au lancement | ||
+ | self.adresse.setText(fichier) | ||
+ | self.returnPressed_m() | ||
+ | | ||
+ | # ======================================================================= | ||
+ | def bidon(self): | ||
+ | pass | ||
+ | | ||
+ | # ======================================================================= | ||
+ | def popupmenutoolbar(self, | ||
+ | """ | ||
+ | | ||
+ | # récupération de la liste des pages de l' | ||
+ | history = self.vuehtml.page().history() | ||
+ | hitems = [] | ||
+ | for hitem in history.items(): | ||
+ | hitems.append(hitem) | ||
+ | ihitem = history.currentItemIndex() | ||
+ | i1 = max(ihitem-10, | ||
+ | i2 = min(ihitem+10, | ||
+ | | ||
+ | # création de l' | ||
+ | popupmenu = QtGui.QMenu(self.toolBar) | ||
+ | | ||
+ | # retour à la page ' | ||
+ | actionHome = popupmenu.addAction(u" | ||
+ | actionHome.triggered.connect(self.home_m) | ||
+ | |||
+ | # ajout d'un séparateur des items du menu | ||
+ | popupmenu.addSeparator() | ||
+ | | ||
+ | # création des items à ajouter au menu | ||
+ | actions = [] | ||
+ | for i in xrange(i1, i2+1): | ||
+ | hitem = hitems[i] | ||
+ | url = unicode(hitem.url().toString()) | ||
+ | if len(url)> | ||
+ | # l' | ||
+ | url = url[:33] + u" | ||
+ | |||
+ | # créaction d'une action | ||
+ | act = QtGui.QAction(url, | ||
+ | # mettre en gras l' | ||
+ | if i==ihitem: | ||
+ | police = act.font() | ||
+ | police.setBold(True) | ||
+ | act.setFont(police) | ||
+ | # connecter l'item avec la méthode à exécuter | ||
+ | act.triggered.connect(partial(self.allera, | ||
+ | | ||
+ | # on ajoute l' | ||
+ | action = popupmenu.addAction(act) | ||
+ | actions.append(action) | ||
+ | |||
+ | # exécution du menu popup | ||
+ | popupmenu.exec_(self.toolBar.mapToGlobal(position)) | ||
+ | | ||
+ | # ======================================================================= | ||
+ | def allera(self, | ||
+ | """ | ||
+ | self.vuehtml.page().history().goToItem(hitem) | ||
+ | | ||
+ | # ======================================================================= | ||
+ | def popupmenuvuehtml(self, | ||
+ | """ | ||
+ | | ||
+ | # crée l' | ||
+ | popupmenu = QtGui.QMenu(self.vuehtml) | ||
+ | | ||
+ | # fait un "zoom plus" avec Alt-P | ||
+ | actionZPlus = popupmenu.addAction(u" | ||
+ | actionZPlus.setShortcut(QtGui.QKeySequence(QtCore.Qt.AltModifier | QtCore.Qt.Key_P)) | ||
+ | actionZPlus.triggered.connect(partial(self.zoom, | ||
+ | |||
+ | # fait un "zoom moins" avec Alt-M | ||
+ | actionZMoins = popupmenu.addAction(u" | ||
+ | actionZMoins.setShortcut(QtGui.QKeySequence(QtCore.Qt.AltModifier | QtCore.Qt.Key_M)) | ||
+ | actionZMoins.triggered.connect(partial(self.zoom, | ||
+ | | ||
+ | # ajout d'un séparateur des items du menu | ||
+ | popupmenu.addSeparator() | ||
+ | | ||
+ | # lance et affiche une impression en pdf avec Alt-I | ||
+ | actionZMoins = popupmenu.addAction(u"& | ||
+ | actionZMoins.setShortcut(QtGui.QKeySequence(QtCore.Qt.AltModifier | QtCore.Qt.Key_I)) | ||
+ | actionZMoins.triggered.connect(self.imprimer_m) | ||
+ | | ||
+ | # exécute le menu popup | ||
+ | popupmenu.exec_(self.vuehtml.mapToGlobal(position)) | ||
+ | |||
+ | # ======================================================================= | ||
+ | def corrigeurl(self, | ||
+ | """ | ||
+ | si adresse disque: l' | ||
+ | si adresse web: l' | ||
+ | """ | ||
+ | # comme " | ||
+ | if url[: | ||
+ | url = u" | ||
+ | | ||
+ | if os.path.exists(url): | ||
+ | # cas d'un fichier disque html: met " | ||
+ | return QtCore.QUrl.fromLocalFile(url) | ||
+ | | ||
+ | # cas d'une adresse web: met " | ||
+ | return QtCore.QUrl.fromUserInput(url) | ||
+ | | ||
+ | # ======================================================================= | ||
+ | def home_m(self): | ||
+ | """ | ||
+ | self.vuehtml.setUrl(self.urlhome) # | ||
+ | self.vuehtml.setFocus() | ||
+ | | ||
+ | # ======================================================================= | ||
+ | def returnPressed_m(self): | ||
+ | """ | ||
+ | |||
+ | # compléte si nécessaire l'url de la ligne d' | ||
+ | url = unicode(self.adresse.text()).strip() | ||
+ | if url==u"": | ||
+ | url = self.urlblank # => " | ||
+ | else: | ||
+ | url = self.corrigeurl(url) | ||
+ | |||
+ | # affiche la page html demandée | ||
+ | self.vuehtml.setUrl(url) #load(url) | ||
+ | self.vuehtml.setFocus() | ||
+ | |||
+ | # ======================================================================= | ||
+ | def loadProgress_m(self, | ||
+ | """ | ||
+ | nompage = self.vuehtml.title() | ||
+ | msg = "%s (%s %%)" % (nompage, progression) | ||
+ | # | ||
+ | self.statusBar().showMessage(msg) | ||
+ | |||
+ | # ======================================================================= | ||
+ | def loadFinished_m(self, | ||
+ | """ | ||
+ | nompage = self.vuehtml.title() | ||
+ | if not ok: | ||
+ | | ||
+ | # | ||
+ | self.statusBar().showMessage(nompage) | ||
+ | | ||
+ | # ======================================================================= | ||
+ | def linkClicked_m(self, | ||
+ | """ | ||
+ | self.vuehtml.setUrl(url) #load(url) | ||
+ | self.vuehtml.setFocus() | ||
+ | |||
+ | # ======================================================================= | ||
+ | def urlChanged_m(self, | ||
+ | """ | ||
+ | self.adresse.setText(url.toString()) | ||
+ | | ||
+ | # | ||
+ | def imprimer_m(self): | ||
+ | """ | ||
+ | | ||
+ | # créer et configurer l' | ||
+ | printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution) | ||
+ | dest = self.imprimepdf | ||
+ | printer.setOutputFileName(dest) | ||
+ | printer.setOutputFormat(QtGui.QPrinter.PdfFormat) | ||
+ | printer.setCreator(u" | ||
+ | printer.setDocName(u" | ||
+ | printer.setPageSize(QtGui.QPrinter.A4) | ||
+ | printer.setOrientation(QtGui.QPrinter.Portrait) # | ||
+ | #ordre des valeurs float des marges: left, top, right, bottom | ||
+ | printer.setPageMargins(20.0, | ||
+ | # | ||
+ | printer.setColorMode(QtGui.QPrinter.Color) | ||
+ | | ||
+ | # imprimer la page affichée | ||
+ | self.vuehtml.print_(printer) | ||
+ | | ||
+ | # afficher le fichier pdf avec le visualiseur pdf par défaut | ||
+ | if os.path.exists(dest): | ||
+ | try: | ||
+ | # solution pour Windows | ||
+ | os.startfile(dest) | ||
+ | except: | ||
+ | # solution pour les Linux récents | ||
+ | os.system(' | ||
+ | |||
+ | # ======================================================================= | ||
+ | def zoom(self, increment): | ||
+ | """ | ||
+ | current = self.vuehtml.textSizeMultiplier() | ||
+ | self.vuehtml.setTextSizeMultiplier(current + increment) | ||
+ | | ||
+ | # ======================================================================= | ||
+ | def keyPressEvent(self, | ||
+ | """ | ||
+ | if self.vuehtml.hasFocus(): | ||
+ | # avec Alt-P => zoom+ | ||
+ | if event.key() == QtCore.Qt.Key_P and \ | ||
+ | | ||
+ | self.zoom(0.1) | ||
+ | event.accept() | ||
+ | # avec Alt-M => zoom- | ||
+ | elif event.key() == QtCore.Qt.Key_M and \ | ||
+ | | ||
+ | self.zoom(-0.1) | ||
+ | event.accept() | ||
+ | # avec Alt-I => Imprime la page affichée | ||
+ | elif event.key() == QtCore.Qt.Key_I and \ | ||
+ | | ||
+ | self.imprimer_m() | ||
+ | event.accept() | ||
+ | else: | ||
+ | event.ignore() | ||
+ | else: | ||
+ | event.ignore() | ||
+ | | ||
+ | # | ||
+ | @QtCore.pyqtSlot() | ||
+ | def apropos_m(self): | ||
+ | """ | ||
+ | pass | ||
+ | |||
+ | ############################################################################# | ||
+ | if __name__ == ' | ||
+ | # code non exécuté si appel en tant que module | ||
+ | |||
+ | app = QtGui.QApplication(sys.argv) | ||
+ | |||
+ | if len(sys.argv) > 1: | ||
+ | url = sys.argv[1] | ||
+ | else: | ||
+ | url = None | ||
+ | |||
+ | url = " | ||
+ | | ||
+ | fen = Navigateurweb(url) | ||
+ | fen.show() | ||
+ | sys.exit(app.exec_()) | ||
+ | </ | ||
+ | |||