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 Trie树实现字典排序
Mar 28 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
Flask实现跨域请求的处理方法
Sep 27 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
Jan 25 Python
Python enumerate内置库用法解析
Feb 24 Python
Python如何省略括号方法详解
Mar 21 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
Jun 04 Python
Virtualenv 搭建 Py项目运行环境的教程详解
Jun 22 Python
python超详细实现完整学生成绩管理系统
Mar 17 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的输入输出流
2007/02/14 PHP
PHP 文件上传限制问题
2019/09/01 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
2015/04/30 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
2018/10/12 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
python处理“
2019/06/10 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
Django实现文件上传和下载功能
2019/10/06 Python
python计算无向图节点度的实例代码
2019/11/22 Python
使用pytorch完成kaggle猫狗图像识别方式
2020/01/10 Python
python编写俄罗斯方块
2020/03/13 Python
python中os包的用法
2020/06/01 Python
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
C#怎么让一个窗口居中显示?
2015/10/20 面试题
顺丰快递Java软件工程师面试题
2015/07/31 面试题
项目考察欢迎辞
2014/01/17 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
民主生活会发言材料
2014/10/20 职场文书
专家推荐信怎么写
2015/03/25 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
六年级上册《闻官军收河南河北》的教学设计
2019/11/15 职场文书
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL