当前位置: 首页 > 编程日记 > 正文

浏览器tab关闭事件_Python--使用Pyqt5实现简易浏览器(最新版本测试过)

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

博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

准备环境

首先我们需要的是我们的开发环境,我使用的是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/26import sysfrom 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_())

结果

可以去点击地址去尝试

b6a086c895e76a52de02c656e9fdad28.png

代码下载

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

贴一下github地址

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

感谢

万能的网络

以及勤劳的自己

相关文章:

JS 中 URL 编码的问题.

URL 编码 为什么要对 URL 编码 1. 避免解析错误 我们的 queryString 的形式是使用 ?开始, keyvalue 传递参数, key-value pairs 之间使用 & 连接.比如: ?postid5038412&t1450591802326服务器会 根据 & 解析 key-value pairs 根据 解析 key,value 那么如果 key或…

通用权限管理模块系列——需求分析——列举需求

以RBAC为理论基础 以低耦合为设计原则 我们计划设计一个独立的权限模块 碰到一些难题,后面另外开文章来讨论 本文主要是列举目前收集到的权限方面的需求信息,如果各位有能提供的用例,请不吝赐教。 各种需求都是从网络或零碎项目里提取的&…

Matlab数据的可视化 -- 散点图

本篇微信图文主要介绍Matlab数据可视化方面的内容。scatter

koa连接mysql_CentOS 环境 Node + Koa2 连接 MySQL (ECS系列三)

Koa 搭建服务新建一个文件夹 koa_server,进入后cnpm i -S koa会生成 node_modules 依赖包,以及 package.json创建文件 server.js,并写入const Koa require(koa);const app new Koa();app.use( async ( ctx ) > {ctx.body hello koa2})a…

Python CRC32 文件校验

binascii.crc32(s [,crc])返回CRC32校验。参数crc指定初始值用于循环。例如:Code>>> import binascii>>> crc binascii.crc32(spam)>>> binascii.crc32( and eggs, crc)739139840>>> binascii.crc32(spam and eggs)739139840C…

国家智慧城市战略实施 保温材料等建材万亿市场待挖掘

近年来,国家多部委联合发布《国家新型城镇化规划(2014—2020)》《关于促进智慧城市健康发展的指导意见》,提出到2020年建成一批特色鲜明的智慧城市。国家智慧城市建设与发展上升为国家战略。2014年中国智慧城市的市场规模达到800多亿元,其中不…

Matlab数据的可视化 -- 极坐标图及其与直角坐标图的转换

本篇微信图文主要介绍Matlab数据可视化方面的内容。polar、pol2cart、cart2pol

mysql 主从复制 性能_zabbix监控mysql各项性能,主从复制

######################################################监控mysql(默认监控模板不能用,再agentd.conf开启自定义key,自己编写脚本)在zabbix_agentd.conf尾部添加(注意相关文件路径,以及脚本权限等问题)vim zabbix_agentd.confUserParameter…

SQL Server基础知识之:设计和实现视图

设计和实现视图可谓是数据库物理设计中的一个非常重要的步骤。从一般意义上说,设计和实现视图应该遵循下面的一些建议和原则。 以下内容摘在文档,我对某些重点进行了补充说明(红色部分) 只能在当前数据库中创建视图。 但是&#x…

Matlab数据的可视化 -- 条形图

本篇微信图文主要介绍Matlab数据可视化方面的内容。bar、barh

全球SDN测试认证中心发布OpenDaylight测试报告

随着软件定义网络(Software Defined Network, SDN)商业部署速度地加快,关乎整个SDN 网络性能表现的控制平面核心组件——SDN 控制器也越来越成为网络用户关心的焦点。日前,天地互连-全球SDN测试认证中心(SDNCTC,www.sdnctc.com)正…

mysql可以做日期处理吗_mysql可以做日期处理吗

最近一个项目,需要写很多的sql语句。涉及到很多与时间相关的处理,现在做一下简单的总结。1.时间格式:在这个项目中,或许是由不同的人建立的数据库表结构吧,对时间的格式步统一,有的表中存储的long类型的时间…

大型网站采用什么系统架构保证性能稳定性

from http://www.bobd.cn/design/web/Theory/200904/31145.html 千万级的注册用户,千万级的帖子,nTB级的附件,还有巨大的日访问量,大型网站采用什么系统架构保证性能和稳定性? 首先讨论一下大型网站需要注意和考虑的问…

Matlab数据的可视化 -- 饼图

本篇微信图文主要介绍Matlab数据可视化方面的内容。pie

Rushcrm:企业部署CRM系统做什么

现在很流行的一个词就是大数据,很多企业开始重视数据的开发利用。CRM在这样的环境背景下诞生了,但这并不意味着所有的企业都能很好的利用好CRM系统(客户关系管理系统)。CRM带来的效益是显而易见的,但是购置了CRM系统仅仅是第一步,…

slot没有毁灭的问题_解析flink之perjob模式下yn参数不生效问题

概要:0. 问题背景1. Stream Job的切分2. 计算资源的调度 & 任务的执行3. 最后的总结0. 问题背景:开始用flink处理流式作业的时候,用yarn-cluster模式提交作业的时候,脚本如下:$FLINK_BIN run -m yarn-cluster -yqu…

获取access中表的相关信息

就用到两条.net自带的获取数据库信息的语句 OleDbConnection con new OleDbConnection(connection); // OleDB数据库连接实例 // 获取数据库中表的相关信息DataTable dt con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "Table"…

Matlab数据的可视化 -- 茎干图

本篇微信图文主要介绍Matlab数据可视化方面的内容。stem

Wink发布Wink Hub2家庭物联网控制中心

智能家居主要厂商之一Wink宣布推出Wink Hub2家庭物联网控制中心,支持更多的家庭物联网产品,更广泛的互联互通,以及提供更好用的控制程序。Wink Hub2主要作用是连接第三方家庭物联网产品,并从一个集中的应用程序进行控制。 Wink Hu…

mysql repalication_MySQL主从复制的原理及配置方法(比较详细)

一、复制的原理MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。将主服务器的数据拷贝到从服务器的一个途径是…

贸易保护主义不能解决德国光伏企业的问题

针对德国媒体近期将该国光伏巨头SolarWorld宣布破产一事与中国相关联,甚至指责“中国盗走德国工作”的论调,中国驻德国大使馆经济商务参赞处公使衔参赞王卫东18日向记者表示,SolarWorld作为当初推动欧盟发起对华光伏产品“双反”措施的领头公…

Matlab数据的可视化 -- 平面多边形的着色

本篇微信图文主要介绍Matlab数据可视化方面的内容。fill

ASP.net session 使用总结(2)

Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息。举个例子来说,我们可以把已登录用户的用户名放在Session中,这样就能通过判断Session中的某个Key来判断用户是否登录,如果登录…

python re模块_Python re模块

正则表达式元字符说明. 匹配除换行符以外的任意字符^ 匹配字符串的开始$ 匹配字符串的结束[] 用来匹配一个指定的字符类别? 对于前一个字符字符重复0次到1次* 对于前一个字符重复0次到无穷次{} 对于前一个字符重复m次{m,n} 对前一个字符重复为m到n次\d 匹配数字,相…

国外优秀开源PHP建站程序一览

大量的PHP开源(开放源代码/Open Source)应用改变了这个世界,改变了互联网,以下我们总结从数据库到购物、博客等众多类型的开源PHP软件,供网站开发者们参考。 博客:WordPress WordPress是使用PHP开发的著名博…

《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.1 引言...

本节书摘来自华章计算机《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一书中的第2章,第2.1节,作者:[美] 德博拉诺兰(Deborah Nolan)  邓肯坦普朗(Duncan Temple Lang)  更多章…

Matlab数据的可视化 -- 三维特殊图形

本篇微信图文主要介绍Matlab数据可视化方面的内容。plot3,bar3,barh3,scatter3

baidumap api MySQL_百度地图API开发笔记一(基础篇)

什么是百度地图API?百度地图API是一套由JavaScript语言编写的应用程序接口,它能够帮助您在网站中构建功能丰富、交互性强的地图应用。百度地图API包含了构建地图基本功能的各种接口,提供了诸如本地搜索、路线规划等数据服务。测试js API代码(…

Matlab数据的可视化 -- 三维网格图形

本篇微信图文主要介绍Matlab数据可视化方面的内容。mesh,meshc,meshz

我国网络安全人才培养缺口巨大

近日在武汉举行的国家网络安全宣传周的相关论坛上,我国网络安全人才培养缺口巨大成为与会专家热议的话题。来自中央和地方相关部门、高校研究者、互联网企业代表均认为,我国网络安全人才输出仍距国家、企业需求有较大差距。 去年6月&#xff…