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
相关产品推荐
相关产品推荐

