Python使用Pyqt5实现简易浏览器(最新版本测试过)


Posted in Python onApril 27, 2020

准备环境

首先我们需要的是我们的开发环境,我使用的是python 3.8.2和pyqt 5.14.2,因为有强迫症,所以喜欢使用最新版的

安装QtWebEngineWidgets

这是新版使用的web浏览器引擎,更加的贴近谷歌浏览器,好像是需要单独安装,我就是这样的

pip3 install QtWebEngineWidgets

多tab页面

做这个的时候遇到好多坑,比如在多个tab里面打开页面,要使用这个QTabWidget,这个不用我们再去下载了,已经集成了

页面链接点击无反应

这个搞了我半天,我之前还一直以为是跨域的问题,其实是这个机制的问题,需要重写createWindow方法

# 创建浏览器,重写重写createwindow方法实现页面连接的点击跳转
class WebEngineView(QWebEngineView):

  def __init__(self, mainwindow, parent=None):
    super(WebEngineView, self).__init__(parent)
    self.mainwindow = mainwindow

  # 重写createwindow()
  def createWindow(self, QWebEnginePage_WebWindowType):
    new_webview = WebEngineView(self.mainwindow)
    self.mainwindow.create_tab(new_webview)
    return new_webview

然后大体就是一些页面的布局,这个可以使用Qt Designer,可以自动转化成为我们的py代码

然后就是一些前进,后退,刷新,停止的方法

整体代码,可运行

# -*- coding: utf-8 -*-
# @Author: dshj
# @Date : 2020/04/26

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWebEngineWidgets import QWebEngineView


# 创建主窗口
class MainWindow(QMainWindow):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    # 设置窗口标题
    self.setWindowTitle('简易浏览器')
    # 设置窗口大小900*600
    self.resize(1300, 700)
    self.show()

    # 创建tabwidget(多标签页面)
    self.tabWidget = QTabWidget()
    self.tabWidget.setTabShape(QTabWidget.Triangular)
    self.tabWidget.setDocumentMode(True)
    self.tabWidget.setMovable(True)
    self.tabWidget.setTabsClosable(True)
    self.tabWidget.tabCloseRequested.connect(self.close_Tab)
    self.setCentralWidget(self.tabWidget)

    # 第一个tab页面
    self.webview = WebEngineView(self) # self必须要有,是将主窗口作为参数,传给浏览器
    self.webview.load(QUrl("http://www.baidu.com"))
    self.create_tab(self.webview)

    # 使用QToolBar创建导航栏,并使用QAction创建按钮
    # 添加导航栏
    navigation_bar = QToolBar('Navigation')
    # 设定图标的大小
    navigation_bar.setIconSize(QSize(16, 16))
    # 添加导航栏到窗口中
    self.addToolBar(navigation_bar)

    # QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中
    # 添加前进、后退、停止加载和刷新的按钮
    back_button = QAction(QIcon('icons/houtui.png'), 'Back', self)
    next_button = QAction(QIcon('icons/qianjin.png'), 'Forward', self)
    stop_button = QAction(QIcon('icons/close.png'), 'stop', self)
    reload_button = QAction(QIcon('icons/shuaxin.png'), 'reload', self)

    # 绑定事件
    back_button.triggered.connect(self.webview.back)
    next_button.triggered.connect(self.webview.forward)
    stop_button.triggered.connect(self.webview.stop)
    reload_button.triggered.connect(self.webview.reload)

    # 将按钮添加到导航栏上
    navigation_bar.addAction(back_button)
    navigation_bar.addAction(next_button)
    navigation_bar.addAction(stop_button)
    navigation_bar.addAction(reload_button)

    # 添加URL地址栏
    self.urlbar = QLineEdit()
    # 让地址栏能响应回车按键信号
    self.urlbar.returnPressed.connect(self.navigate_to_url)

    navigation_bar.addSeparator()
    navigation_bar.addWidget(self.urlbar)

    # 让浏览器相应url地址的变化
    self.webview.urlChanged.connect(self.renew_urlbar)

  # 显示地址
  def navigate_to_url(self):
    q = QUrl(self.urlbar.text())
    if q.scheme() == '':
      q.setScheme('http')
    self.webview.setUrl(q)

  # 响应输入的地址
  def renew_urlbar(self, q):
    # 将当前网页的链接更新到地址栏
    self.urlbar.setText(q.toString())
    self.urlbar.setCursorPosition(0)

  # 创建tab页面
  def create_tab(self, webview):
    self.tab = QWidget()
    self.tabWidget.addTab(self.tab, "新建页面")
    self.tabWidget.setCurrentWidget(self.tab)

    # 渲染到页面
    self.Layout = QHBoxLayout(self.tab)
    self.Layout.setContentsMargins(0, 0, 0, 0)
    self.Layout.addWidget(webview)

  # 关闭tab页面
  def close_Tab(self, index):
    if self.tabWidget.count() > 1:
      self.tabWidget.removeTab(index)
    else:
      self.close() # 当只有1个tab时,关闭主窗口


# 创建浏览器,重写重写createwindow方法实现页面连接的点击跳转
class WebEngineView(QWebEngineView):

  def __init__(self, mainwindow, parent=None):
    super(WebEngineView, self).__init__(parent)
    self.mainwindow = mainwindow

  # 重写createwindow()
  def createWindow(self, QWebEnginePage_WebWindowType):
    new_webview = WebEngineView(self.mainwindow)
    self.mainwindow.create_tab(new_webview)
    return new_webview


# 程序入口
if __name__ == "__main__":
  app = QApplication(sys.argv)
  # 创建主窗口
  browser = MainWindow()
  browser.show()
  # 运行应用,并监听事件
  sys.exit(app.exec_())

结果

可以去点击地址去尝试

Python使用Pyqt5实现简易浏览器(最新版本测试过)

代码下载

图标什么的可以在阿里巴巴矢量图标库里面去找到

贴一下github地址

https://github.com/Tangleia/Python-tools-borwser

到此这篇关于Python使用Pyqt5实现简易浏览器(最新版本测试过)的文章就介绍到这了,更多相关Python 简易浏览器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python多线程学习资料
Dec 19 Python
Python中用sleep()方法操作时间的教程
May 22 Python
pandas重新生成索引的方法
Nov 06 Python
Python实现简单石头剪刀布游戏
Jan 20 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
numpy中三维数组中加入元素后的位置详解
Nov 28 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
Jan 08 Python
TensorFlow加载模型时出错的解决方式
Feb 06 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
Python使用sqlite3模块内置数据库
May 07 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
零基础学python应该从哪里入手
Aug 11 Python
python读取yaml文件后修改写入本地实例
Apr 27 #Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 #Python
Python判断字符串是否为空和null方法实例
Apr 26 #Python
如何将PySpark导入Python的放实现(2种)
Apr 26 #Python
基于python实现对文件进行切分行
Apr 26 #Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 26 #Python
简单了解Java Netty Reactor三种线程模型
Apr 26 #Python
You might like
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
半角全角相互转换的js函数
2009/10/16 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
利用Python实现图书超期提醒
2016/08/02 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
python和shell获取文本内容的方法
2018/06/05 Python
详解基于django实现的webssh简单例子
2018/07/17 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
python获取linux系统信息的三种方法
2020/10/14 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
八一慰问活动方案
2014/02/07 职场文书
销售主管岗位职责
2014/02/08 职场文书
工作目标责任书
2014/07/23 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
高考诚信考试承诺书
2015/04/29 职场文书