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抓取Discuz!用户名脚本代码
Dec 30 Python
python实现socket客户端和服务端简单示例
Feb 24 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
python实现感知器算法(批处理)
Jan 18 Python
详解Python3定时器任务代码
Sep 23 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
详解Pycharm与anaconda安装配置指南
Aug 25 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 Python
TensorFlow低版本代码自动升级为1.0版本
Feb 20 Python
C站最全Python标准库总结,你想要的都在这里
Jul 03 Python
深入理解Pytorch微调torchvision模型
Nov 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
yii添删改查实例
2015/11/16 PHP
php实现购物车功能(上)
2020/07/23 PHP
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
2014/05/14 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
javascript实现循环广告条效果
2017/12/12 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
python自动格式化json文件的方法
2015/03/11 Python
python实现感知器
2017/12/19 Python
对Python中的@classmethod用法详解
2018/04/21 Python
python绘制彩虹图
2019/12/16 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
python输入中文的实例方法
2020/09/14 Python
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
个人剖析材料及整改措施
2014/10/07 职场文书
2014年手术室工作总结
2014/11/26 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
小平您好观后感
2015/06/09 职场文书
信息技术国培研修日志
2015/11/13 职场文书
委托书范本格式
2019/04/18 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python
SpringBoot Http远程调用的方法
2022/08/14 Java/Android