在pyside的QWebEngineView中和javascript通信

liftword2个月前 (05-14)技术文章26

在pyside2中可以使用QtWebChannel 使QWebEngineView和前端页面的javasccript通信

代码:

from PySide2.QtWebChannel import QWebChannel
from PySide2.QtCore import QUrl, Signal, Slot, QObject
from PySide2.QtWebEngineWidgets import QWebEngineProfile, QWebEnginePage, QWebEngineSettings,QWebEngineView
#创建一个桥
class Bridge(QObject):
    #信号槽函数 接收javascript发送的消息
    @Slot(str)
    def js_message(self, text):
        # 这里可以处理从 JavaScript 接收到的选择内容
        print(text)
    # Python反馈消息给JavaScript  
    @Slot(str, result=str)  
    def python_message(self, text):  
        # 处理消息,并返回结果  
        result = f"Python收到: {text}, 回复: 你好!"  
        return result 

#自定义一个QWebEngineView类
class MyWebEngineView(QWebEngineView):
    def __init__(self, parent=None):
        super(MyWebEngineView, self).__init__(parent)


        page = QWebEnginePage()
        self.setPage(page)
        #创建QWebChannel
        self.channel = QWebChannel()
        self.bridge = Bridge()
        #将bridge注册到QWebChannel
        self.channel.registerObject('bridge', self.bridge)
        self.page().setWebChannel(self.channel)

    #重写setHtml 对加载的页面增加qwebchannel.js的调用和 上面bridge对象的调用
    def setHtml(self, html_content):
        modified_html = html_content+"""
            <script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script>
            <script>
                var bridge;
               new QWebChannel(qt.webChannelTransport, function (channel) {
                   bridge = channel.objects.bridge;
               });
               var message= '发送给python程序'
                bridge.js_message(html);
            </script>   
            """
        super(MyWebEngineView, self).setHtml(modified_html)
上面示例介绍了前端页面加载的时候,发送给pyside信息.

如果是接收python发送来的消息,如下面实现:
<script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script>  
<script>  
    var bridge;  
    new QWebChannel(qt.webChannelTransport, function (channel) {  
        bridge = channel.objects.bridge;  
  
        // 调用Python方法  
        bridge.python_message('Hello from JavaScript').then(function(result) {  
            console.log(result);  // 输出Python的回复  
        });  
        
    });  
</script>

相关文章

如何使用 Scrapy 执行 JavaScript

大多数现代网站都使用客户端 JavaScript 框架,例如 React、Vue 或 Angular。在没有服务器端渲染的情况下从动态网站抓取数据通常需要执行 JavaScript 代码。我已经抓取了...

Python爬虫高级之JS渗透登录新浪微博 | 知了独家研究

小伙伴们看到标题可能会想,我能直接自己登陆把登陆后的cookie复制下来加到自定义的请求头里面不香嘛,为什么非要用python模拟登录的过程?如果我们是长期爬取数据,比如每天早上中午和晚上定时爬取新浪...

网页数据如何获取,带你走近JS逆向,完全入门级!

在这个大数据时代,我们眼睛所看到的百分之九十的数据都是通过页面呈现出现的,不论是PC端、网页端还是移动端,数据渲染还是基于html/h5+javascript进行的,而大多数的数据都是通过请求后台接口...

python散装笔记——151: 非官方Python实现

1: IronPythonIronPython是一个开源的Python实现,专为.NET和Mono设计,使用C#编写,采用Apache License 2.0授权。它依赖于DLR(动态语言运行时)。目...

Python 和 JavaScript 终于联姻了!PythonMonkey 要火?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。什么是 Pyt...

Python 标准库中鲜为人知的宝藏 | Node.js 22.8.0 发布

Python 标准库中鲜为人知的宝藏Python 标准库功能强大,但有些模块却鲜为人知。本文将介绍一些有趣且实用的模块,助你提升代码效率和功能 。数据结构:超越列表和字典除了常用的列表和字典,coll...