我正在编写一个带有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 :
function testMe() { alert('js function testMe called'); }
pyBridge.doStuff("bla");
testMe();
从JS调用Python函数,以及从JS调用testMe
。从Python中调用像alert
这样的“标准”JS函数也可以。
最后两行Python行不会:
evaluateJavaScript("testMe()")
根本不做任何事情。
最后一行执行第一个警报,之后不再继续。
编辑:我已经尝试在加载和调用time.sleep()
之间有一些evaluateJavaScript
,我正在从本地计算机上加载网页。
答案 0 :(得分:1)
最可能的问题是JavaScript尚未加载。添加time.sleep()
调用对此没有帮助,这些调用也会阻止Qt事件循环继续,而不仅仅是Python代码。
尝试等待页面完全加载,例如(使用the loadFinished signal:
def onLoad():
frame.evaluateJavaScript('testMe()')
frame.loadFinished.connect(onLoad)
另外,为了在这种情况下获取更多调试信息,您可能希望实现QtWebKit.QWebPage.javaScriptConsoleMessage。
答案 1 :(得分:1)
示例代码中至少有两个错误。
首先,当您将对象添加到javascript窗口时,您将其称为“pyBridge”,但您尝试在javascript中将其引用为“bridgeObj”。显然,这将抛出ReferenceError
,这将阻止进一步执行脚本。
其次,doStuff
方法缺少self
参数,这将导致PySide引发TypeError
。
处理这两个问题应该足以修复您的示例代码,只要您确保在加载html之前将桥对象添加到javacsript窗口。如果要在顶级JavaScript代码中引用桥对象,则需要执行此步骤。但是,如果桥接对象仅在函数级代码中引用,则可以在加载html后将其安全地添加到javascript窗口中。