You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySide6调用runJavaScript时能否实现回调与调用方法同步?

PySide6 runJavaScript同步执行实现方案

这个同步需求是可以实现的。runJavaScript本身是异步API,回调会投递到Qt主线程的事件队列等待执行,直接使用threading.Event阻塞主线程会导致Qt事件循环停止运行,回调永远无法触发,因此需要使用Qt自带的局部事件循环实现等待逻辑。

改造后可运行的完整代码

from PySide6 import QtGui, QtCore, QtWidgets, QtWebEngineWidgets
from PySide6.QtWebEngineCore import QWebEnginePage

class WebOperator:
    def __init__(self):
        self.myView = QtWebEngineWidgets.QWebEngineView()
        self._value = -1  # 提前初始化存储JS返回值的变量

    def getValue(self):
        # 创建局部事件循环,用于等待JS回调执行
        js_loop = QtCore.QEventLoop()

        # 回调包装器,执行完原有逻辑后退出事件循环
        def wrapped_callback(res):
            self._getvalueCallback(res)
            js_loop.quit()

        self.myView.page().runJavaScript(
            '''
            (function () {
                finds = document.getElementsByClassName('ps');
                if (finds.length > 0) return finds[0].offsetWidth;
                return -1;
            })();
            ''', 0, wrapped_callback
        )

        # 启动局部事件循环,此时不会阻塞全局事件的处理,回调可以正常触发
        js_loop.exec()
        return self._value

    def _getvalueCallback(self, value):
        if isinstance(value, float):
            self._value = int(value)
        else:
            self._value = -1

注意事项

  • 该方案通过局部事件循环实现等待,不会阻塞界面响应,但不建议在多层嵌套事件循环的场景下高频使用,避免出现事件调度混乱
  • 调用getValue前需要确保页面已经加载完成,否则可能获取不到预期的DOM元素,返回值异常

内容的提问来源于stack exchange,提问作者Eby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:06:02