当前位置: 首页 > news >正文

python界面开发webview_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/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_Python花式编程案例集锦(5)
  • python装饰器作用和功能_Python装饰器实现类Java注解功能
  • 树莓派无屏幕安装kali_树莓派制作魔镜屏幕旋转不正确的处理方法
  • 没有与参数列表匹配的重载函数_C++覆盖和重载的区别
  • python嵌入式系统开发_python能开发单片机吗
  • python根据excel生成报表_python提取Excel中的特定列生成新的表格
  • python显示数据长度_python 读取数据再写入,文件大小总会出现变差?
  • datagrid如何获取一行数据中的某个字段值_UI测试中,我们应该注意哪些?
  • python常考题_python 一个批量出考题,生成不同考卷的小例题
  • python简历项目经验在哪里找_Linux运维工程师简历项目经验
  • matlab函数编写_实验二 | M函数与M文件的编写与应用
  • docker 部署_docker自动化部署前端项目实战
  • 如何将网站前端如何添加登录密码访问_如何将自己的网站上线到服务器端详解!...
  • python根据时间序列画折线图_如何根据时间序列金融数据画出分年对比的季节性图表...
  • tkinter.filedialog如何一次性选择多个文件_多个文档怎样一键重命名?用这款工具只需七步即可实现...
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [译] React v16.8: 含有Hooks的版本
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CSS相对定位
  • eclipse(luna)创建web工程
  • es6--symbol
  • If…else
  • JS数组方法汇总
  • Mithril.js 入门介绍
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • 安卓应用性能调试和优化经验分享
  • 飞驰在Mesos的涡轮引擎上
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 来,膜拜下android roadmap,强大的执行力
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 想写好前端,先练好内功
  • - 转 Ext2.0 form使用实例
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 7行Python代码的人脸识别
  • 如何正确理解,内页权重高于首页?
  • ​人工智能书单(数学基础篇)
  • #android不同版本废弃api,新api。
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • ()、[]、{}、(())、[[]]命令替换
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (function(){})()的分步解析
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (十八)三元表达式和列表解析
  • (一)SpringBoot3---尚硅谷总结
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)创业家杂志:UCWEB天使第一步
  • (转)关于多人操作数据的处理策略
  • (转)四层和七层负载均衡的区别
  • .Mobi域名介绍
  • .NET 回调、接口回调、 委托
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • :中兴通讯为何成功
  • @EnableAsync和@Async开始异步任务支持
  • [2021 蓝帽杯] One Pointer PHP
  • [ai笔记4] 将AI工具场景化,应用于生活和工作