QtWebKit桥:调用JavaScript函数

2024-09-19 23:41:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个带有HTML接口和Python代码的混合应用程序。 我可以通过共享对象访问Python函数:

pythonPart.py

class BO(QObject):
    def __init__(self, parent=None):
        super(BO, self).__init__(parent)

    @Slot(str)
    def doStuff(self, txt):
        print(txt)

bridgeObj = BO()

# init stuff and frame...
frame.addToJavaScriptWindowObject( 'pyBridge', bridgeObj )
frame.evaluateJavaScript('alert("Alert from Python")')
frame.evaluateJavaScript('testMe()')
frame.evaluateJavaScript('alert("Starting test");testMe();alert("Test over")')

jsPart.js

^{pr2}$

从JS调用Python函数和从JS调用testMe一样有效。{JS>“从标准调用函数”也可以。在

最后两行Python不会: evaluateJavaScript("testMe()")根本不做任何事情。 最后一行执行第一个警报,之后不会继续。在

编辑:我已经尝试在加载和调用evaluateJavaScript之间使用一些time.sleep(),我正在从本地计算机加载该网页。在


Tags: 函数代码selftxtinitdefhtmljs
2条回答

示例代码中至少有两个错误。在

首先,当您将对象添加到javascript窗口时,您将其称为“pyBridge”,但随后您尝试在javascript中将其引用为“bridgeObj”。显然,这将抛出一个ReferenceError,这将阻止脚本的进一步执行。在

其次,doStuff方法缺少一个self参数,这将导致PySide引发一个{}。在

处理这两个问题就足以修复示例代码了,只要确保在加载html之前将bridge对象添加到javacscript窗口。如果要在顶级javascript代码中引用bridge对象,则需要执行此步骤。但是,如果只在函数级代码中引用桥对象,则可以在加载html之后将其安全地添加到javascript窗口中。在

最可能的问题是JavaScript还没有加载。添加time.sleep()调用无助于此,它们还将阻止Qt事件循环继续,而不仅仅是Python代码。在

尝试等待页面完全加载,例如(使用the loadFinished signal

def onLoad():
    frame.evaluateJavaScript('testMe()')

frame.loadFinished.connect(onLoad)

另外,为了在这种情况下获得更多的调试信息,您可能需要实现QtWebKit.QWebPage.javaScriptConsoleMessage。在

相关问题 更多 >