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 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_()) |