文档章节

利用 python 的各种开源工具自制浏览器

花果山妖
 花果山妖
发布于 2014/08/06 12:31
字数 1062
阅读 1139
收藏 5

0.导言

很多时候,我们有这样的需求:想利用现在先进的HTML5和JS技术,又不想走B/S架构,想弄出个像客户端一样的浏览器外壳。本文要解决的就是这个问题,我们利用 python 环境下所提供的各种工具,编译生成一个高度可用的制作浏览器。

1.准备工作

这里说一下自制浏览器所需要的环境与软件。

  • windows操作系统:因为我最后要生成一个exe文件,所以操作系统环境直接利用了windows。

  • python2.7 :我利用的是python2.7的环境,这是我觉得目前用的最顺手的一个环境,注:虽然我的系统是64位的,但这里安装的python环境是32位的,因为考虑到做出来的浏览器的兼容性,还是用32位的环境。

  • PyQt4 :Qt 是一款GUI应用程序的开发框架,因为我们既然要做浏览器,图形界面是免不了的,PyQt4是Qt在python环境下的一个实现,而且这个包中还包含了webkit浏览器内核,非常好用。官方网站:http://www.riverbankcomputing.co.uk/news

  • PyInstaller : 这是一个可以把python程序转换成exe可执行程序的 python 包,也很好用。官方网址:http://www.pyinstaller.org/ 

  • pywin32 : 这是 PyInstaller 需要依赖的一个包。下载地址:http://sourceforge.net/projects/pywin32/

  • UPX : 这是一款先进的可执行程序文件压缩器,若不安装它,运行 pyinstaller.py 会报错。下载地址:http://sourceforge.net/projects/upx/  ;下载完之后放在 PyInstaller中与pyinstaller.py的相同目录下。

  • VerySimpleWebBrowser.py:这是一个老外用 python 写的简单的浏览器的源码,我数了一下,总共的实际代码只有43行,如果你电脑已经安装了python 和 pyqt4 , 你已经可以用python环境运行它: pyhon VerySimpleWebBrowser 。下载地址: http://www.binpress.com/app/verysimplewebbrowser/279 

好了,需要的东西就这么多,其实都是组装别人的东西,我没有自己写一行代码。

3.制作过程

  1. 安装 python 环境

    这步就不说了~

  2. 安装 PyQt 

    这步也是一顿下一步~没什么说的

  3. 安装 pywin32

    也是一顿下一步~

  4. 安装 pyinstaller

    这个东西下载的是源码,我先 python setup.py install 了一下,其实我也不太清楚这步有没有必要,因为最后还是要到它的文件夹下利用 pyinstaller.py这个文件。

  5. 安装 UPX

    这步其实就是像我上面说的,把下载后的文件 copy 到 PyInstaller的文件目录下,(放在和 pyinstaller.py 同 一个目录)

  6. 打包 VerySimpleWebBrowser.py

    将 VerySimpleWebBrowser.py 也 copy 到 pyinstaller.py 的同目录下。在命令行下切换到此目录,运行 :

python pyinstaller.py -F -w VerySimpleWebBrowser.py

如果没有问题的话,现在已经生成了 VerySimpleWebBrowser.exe,这里有两个选项, -F 表示将所有文件都打包到 exe 中, -w 表示用窗口显示。

最终的结果如下:

稍微包装一下之后就可以作为展现js的本地客户端使用(图可以动哦~):

3.总结

整个过程其实就是个拼装过程,只要细心些就可以了~ 大家感受一下 python 的强大与便捷吧!

4.附录

最后我把 VerySimpleWebBrowser.py 的源代码贴出来吧~让大家看看它是有多么简单!

"""
    ********************* VerySimpleWebBrowser ************************

    This is a Very Simple Web Browser implemented over Qt and QtWebKit.
    More info on: https://codescience.wordpress.com/

    author: Juan Manuel Garcia <jmg.utn@gmail.com>

    *******************************************************************
"""

import sys
from PyQt4 import QtCore, QtGui, QtWebKit

class Browser(QtGui.QMainWindow):

    def __init__(self):
        """
            Initialize the browser GUI and connect the events
        """

        QtGui.QMainWindow.__init__(self)
        self.resize(800,600)
        self.centralwidget = QtGui.QWidget(self)

        self.mainLayout = QtGui.QHBoxLayout(self.centralwidget)
        self.mainLayout.setSpacing(0)
        self.mainLayout.setMargin(1)

        self.frame = QtGui.QFrame(self.centralwidget)

        self.gridLayout = QtGui.QVBoxLayout(self.frame)
        self.gridLayout.setMargin(0)
        self.gridLayout.setSpacing(0)

        self.horizontalLayout = QtGui.QHBoxLayout()
        self.tb_url = QtGui.QLineEdit(self.frame)
        self.bt_back = QtGui.QPushButton(self.frame)
        self.bt_ahead = QtGui.QPushButton(self.frame)

        self.bt_back.setIcon(QtGui.QIcon().fromTheme("go-previous"))
        self.bt_ahead.setIcon(QtGui.QIcon().fromTheme("go-next"))

        self.horizontalLayout.addWidget(self.bt_back)
        self.horizontalLayout.addWidget(self.bt_ahead)
        self.horizontalLayout.addWidget(self.tb_url)
        self.gridLayout.addLayout(self.horizontalLayout)

        self.html = QtWebKit.QWebView()
        self.gridLayout.addWidget(self.html)
        self.mainLayout.addWidget(self.frame)
        self.setCentralWidget(self.centralwidget)

        self.connect(self.tb_url, QtCore.SIGNAL("returnPressed()"), self.browse)
        self.connect(self.bt_back, QtCore.SIGNAL("clicked()"), self.html.back)
        self.connect(self.bt_ahead, QtCore.SIGNAL("clicked()"), self.html.forward)
        self.connect(self.html, QtCore.SIGNAL("urlChanged(const QUrl)"), self.url_changed)

        self.default_url = "http://codescience.wordpress.com/"
        self.tb_url.setText(self.default_url)
        self.browse()

    def browse(self):
        """
            Make a web browse on a specific url and show the page on the
            Webview widget.
        """

        url = self.tb_url.text() if self.tb_url.text() else self.default_url
        self.html.load(QtCore.QUrl(url))
        self.html.show()
        
    def url_changed(self, url):
        """
            Triggered when the url is changed
        """
        self.tb_url.setText(url.toString())


if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    main = Browser()
    main.show()
    sys.exit(app.exec_())


© 著作权归作者所有

共有 人打赏支持
花果山妖
粉丝 3
博文 17
码字总数 9727
作品 0
沈阳
私信 提问
加载中

评论(2)

花果山妖
花果山妖

引用来自“Elkan”的评论

按照你的文章试了下,打包后的exe打开没有反应呢? 这个是什么问题?
应该是中文目录问题,我后来换解决方案了~有兴趣试下node-webkit
Elkan
Elkan
按照你的文章试了下,打包后的exe打开没有反应呢? 这个是什么问题?
AryaLinux 发布 1.0 版:基于基于 LFS/BLFS 的发行版

AryaLinux 是一个独立的基于源码(Source-based)的 Linux 发行版暨平台。其由可用于构建一个完整的 GNU/Linux 系统的诸多构建脚本组成,这些构建脚本参照了 LFS 及 BLFS 编写,AryaLinux 既...

问题终结者
2018/07/26
0
0
绝了!Python又放大招,逆袭宇宙语言!

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 自2017年国务院印发《新一代人工智能发展规划》,明确指出在中小学阶段设置人工智能相关课程后,Python一路逆...

CSDN程序人生
2018/09/10
0
0
新手零基础学习Python第一步,搭建开发环境!

如何在电脑上面搭建Python开发环境?本文会解答这个问题。 Python是一门计算机编程语言,通过给计算机下达精确的指令以完成相应的任务或者事情。 人类掌握Python后,就可以利用这个工具告诉计...

1229747455418890
02/22
0
0
牛!这三个原因让 Python 火爆!

2018年,Python已经成为了一种非常通用的语言,无论是从入门级选手到专业级数据挖掘、科学计算、图像处理、人工智能,Python都可以胜任。或许是因为这种万能属性,使Python越来越受到编程者的...

CSDN资讯
2018/09/27
0
0
牛!这三个原因让Python火爆!

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 2018年,Python已经成为了一种非常通用的语言,无论是从入门级选手到专业级数据挖掘、科学计算、图像处理、人...

CSDN程序人生
2018/09/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
47分钟前
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
2
0
微信网页授权获取用户信息(ThinkPHP5)+ 微信发送客服消息(一)

以thinkphp5为实例,创建控制器 class Kf extends Controller { /** * [protected description]微信公众号appid * @var [type] */ protected $appid = "xxxxxxxxxxxxxxx"; /** * [protected......

半缘修道半缘君丶
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部