赞
踩
最近使用pyqt5制作了一个浏览器抓取截图的小工具,很感兴趣就拿来研究了以下,遇到一些坑记录以下:
代码在最后
1、首先是python的pip可执行文件在python的安装目录的Scripts这个子目录里面,使用的话只能是在CMD当中使用。在python中执行就会提示找不到,在PyDev console也是这样。
如果CMD中提示不是内部或外部命令... 就需要配置环境变量到电脑中,就是在path中添加一条指向Python\Python38\Scripts的变量,之后重启CMD就可以了。
2、python版本问题,搜罗了好久
Note that for v5.11 and later the 32-bit Windows wheels do not contain
the WebEngine modules.
翻译:请注意,对于v5.11及更高版本,32位Windows轮盘不包含WebEngine模块。
解决:
【方法一】 指定安装5.10.1版本的pyqt5
pip install pyqt5==5.10.1
【方法二】 单独安装WebEngine,安装命令为:
pip install PyQtWebEngine
解决 No module named 'PyQt5.QtWebEngineWidgets'
我使用的版本是,可以作为参考
3、然后出现有的链接可以点进去,有的点击完没反应
原因:这是因为网页中部分链接是在新标签页中打开的,而这中js请求在QtWebEngineView中会调用creatwiondow这个方法
只要重写这个方法,实现自己的逻辑就可以了,我看到了常见做法是添加tab页面,还有一种是直接在本窗口新建tab,代码如下:
- # -*- coding: utf-8 -*-
- # @Author: liyl
- # @Date : 2020/08/01
-
- import sys
-
- from PyQt5 import QtCore
- from PyQt5.QtWidgets import *
- from PyQt5.QtCore import *
- from PyQt5.QtGui import *
- from PyQt5.QtWebEngineWidgets import QWebEngineView
-
-
- # 创建主窗口
- from main import WebEngineView
-
-
- class MainWindow(QMainWindow):
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- # 设置窗口标题
- self.setWindowTitle('浏览器')
- # 设置窗口大小900*600
- self.resize(1300, 700)
- self.show()
-
- # 当前view加载地址
-
- self.webview = WebEngineView(self)
- self.webview.setUrl(QUrl("http://www.baidu.com"))
- self.setCentralWidget(self.webview)
-
- # 使用QToolBar创建导航栏,并使用QAction创建按钮
- # 添加导航栏
- navigation_bar = QToolBar('Navigation')
- # 设定图标的大小
- navigation_bar.setIconSize(QSize(16, 16))
- # 添加导航栏到窗口中
- self.addToolBar(navigation_bar)
-
- # 添加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的方式。 (不推荐使用这种方式)
- # 注:这种方式有个问题,因为新建的tab覆盖了原来的tab,所以,原来tab的所有信息都找不到了,如浏览,账号,密码等。
- class WebEngineView(QWebEngineView):
- # 重写createwindow()
- def createWindow(self, QWebEnginePage_WebWindowType):
- return self
-
- # 第二种,就是新建窗口
- # class WebEngineView(QWebEngineView):
- # windowList = []
- #
- # # 重写createwindow()
- # def createWindow(self, QWebEnginePage_WebWindowType):
- # new_webview = WebEngineView()
- # new_window = MainWindow()
- # new_window.setCentralWidget(new_webview)
- # # new_window.show()
- # self.windowList.append(new_window) # 注:没有这句会崩溃!!!
- # return new_webview
-
- # 程序入口
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- # 创建主窗口
- browser = MainWindow()
- browser.show()
- # 运行应用,并监听事件
- sys.exit(app.exec_())
参考原文链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。