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之yield表达式学习
Sep 02 Python
python实现对一个完整url进行分割的方法
Apr 29 Python
python复制文件的方法实例详解
May 22 Python
Python中json格式数据的编码与解码方法详解
Jul 01 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
python 判断是否为正小数和正整数的实例
Jul 23 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
对Python中的@classmethod用法详解
Apr 21 Python
python中单例常用的几种实现方法总结
Oct 13 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 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生成自己的LOG文件
2006/10/09 PHP
用Zend Encode编写开发PHP程序
2010/02/21 PHP
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
关于php mvc开发模式的感想
2011/06/28 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
python中PyQuery库用法分享
2021/01/15 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
戴尔英国官网:Dell英国
2017/05/27 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
土木工程专业个人求职信
2013/12/05 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
六年级学生评语大全
2014/12/26 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书
初中政治教学反思
2016/02/23 职场文书
公司与个人合作协议书
2016/03/19 职场文书
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
Redis主从复制操作和配置详情
2022/09/23 Redis