| 12
 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
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 
 | #!/usr/bin/python3
 
# Source :
#    http://www.developpez.net/forums/d979176/autres-langages/python-zope/gui/pyqt/utilisation-qtwebkit-pyqt4-fancybrowser-py/#post5488866
 
from PyQt4.QtWebKit import QWebView, QWebPage
from PyQt4.QtCore import QUrl, QObject, SIGNAL
from PyQt4.QtGui import QApplication, QMainWindow, QLineEdit, QSizePolicy, \
                        QAction, QStyle
 
 
def url_fetch(url, path):
    from urllib.request import urlretrieve
 
    name = os.path.basename(url)
    fullname = "%(path)s/%(name)s" % vars()
    if not os.path.exists(fullname):
        urlretrieve(url, fullname)
    with open(fullname, 'r') as f:
        buffer = f.read()
    return buffer
 
 
class Browser(QMainWindow):
 
    def __init__(self, url, jquery):
        super(Browser, self).__init__()
 
        self._progress = 0
 
        self._jquery = jquery
        self._js_loaded = False
        connect = self.connect
 
        # create WebView
        view = self._view = QWebView()
        view.load(QUrl(url))
        connect(view, SIGNAL("loadFinished (bool)"), self._adjustLocation)
        connect(view,SIGNAL("titleChanged(const QString&)"), self._adjustTitle);
        connect(view,SIGNAL("loadProgress(int)"), self._setProgress);
        connect(view,SIGNAL("loadFinished(bool)"), self._finishLoading);
        # setup location editable line
        locationEdit = self._locationEdit = QLineEdit()
        locationEdit.setSizePolicy(QSizePolicy.Expanding,
            locationEdit.sizePolicy().verticalPolicy())
        connect(locationEdit, SIGNAL("returnPressed()"), self._changeLocation)
        # setup toolbar
        toolBar = self._toolBar = self.addToolBar("Navigation")
        actions = list(map(view.pageAction, [ QWebPage.Back, QWebPage.Forward,
                    QWebPage.Reload, QWebPage.Stop]))
        toolBar.addActions(actions)
        toolBar.addWidget(locationEdit)
        # setup effects menu
        effectMenu = self._effectMenu = self.menuBar().addMenu("&Effect")
        code = r"""
            $('a').each( function () {
                $(this).css('background-color', 'yellow') } )
            """
        effectMenu.addAction("Highlight all links", lambda: self._eval_js(code))
        rotateAction = self._rotateAction = QAction(self)
        rotateAction.setIcon(self.style().standardIcon(QStyle.SP_FileDialogDetailedView))
        rotateAction.setCheckable(True)
        rotateAction.setText("Turn images upside down")
        connect(rotateAction, SIGNAL("toggled(bool)"), self._rotateImages)
        effectMenu.addAction(rotateAction)
        # setup tools menu
        toolsMenu = self._toolsMenu = self.menuBar().addMenu("&Tools")
        toolsMenu.addAction("Remove all GIF images",
                lambda: self._eval_js(r"$('[src*=gif]').remove()"))
        toolsMenu.addAction("Remove all inline frames",
                lambda: self._eval_js( r"$('iframe').remove()"))
        toolsMenu.addAction("Remove all object elements",
                lambda: self._eval_js(r"$('object').remove()"))
        toolsMenu.addAction("Remove all embedded elements",
                lambda: self._eval_js(r"$('embed').remove()"))
        # set everything together
        self.setCentralWidget(view);
        # grabs frame
        self._frame = view.page().mainFrame()
 
    def _adjustLocation(self):
        self._locationEdit.setText(self._view.url().toString());
 
    def _changeLocation(self):
        url = QUrl(self._locationEdit.text())
        view = self._view
        view.load(url)
        view.setFocus()
 
    def _adjustTitle(self):
        view = self._view
        progress = self._progress
        if progress <= 0 or progress >= 100:
            self.setWindowTitle(view.title())
        else: self.setWindowTitle("%s (%s %%)" % (view.title(), progress))
 
    def _setProgress(self, p):
        self._progress = p
        self._adjustTitle()
 
    def _finishLoading(self, bool):
        self._progress = 100
        self._adjustTitle()
        self._js_loaded = False
 
    def _rotateImages(self, toggle):
        code = r"""$('img').each( function () {
                $(this).css('-webkit-transition', '-webkit-transform 2s') } )"""
        self._eval_js(code)
        if (toggle):
            code = r"""$('img').each( function () {
                    $(this).css('-webkit-transform', 'rotate(180deg)') } )"""
        else:
            code = r"""$('img').each( function () {
                    $(this).css('-webkit-transform', 'rotate(0deg)') } )"""
        self._eval_js(code)
 
    def _eval_js(self, js_code):
        js_eval = self._frame.evaluateJavaScript
        if not self._js_loaded:
             js_eval(self._jquery)
             self._js_loaded = True
        js_eval(js_code)
 
if __name__ == '__main__':
    import sys
    import os
 
    URL = 'http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js'
    PATH = os.getcwd()
    jquery = url_fetch(URL, PATH)
 
    app = QApplication(sys.argv)
    Browser('http://www.google.com/ncr', jquery).show()
    sys.exit(app.exec_()) | 
Partager