我正在编写一个带有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()
,我正在从本地计算机加载该网页。在
示例代码中至少有两个错误。在
首先,当您将对象添加到javascript窗口时,您将其称为“pyBridge”,但随后您尝试在javascript中将其引用为“bridgeObj”。显然,这将抛出一个
ReferenceError
,这将阻止脚本的进一步执行。在其次,}。在
doStuff
方法缺少一个self
参数,这将导致PySide引发一个{处理这两个问题就足以修复示例代码了,只要确保在加载html之前将bridge对象添加到javacscript窗口。如果要在顶级javascript代码中引用bridge对象,则需要执行此步骤。但是,如果只在函数级代码中引用桥对象,则可以在加载html之后将其安全地添加到javascript窗口中。在
最可能的问题是JavaScript还没有加载。添加
time.sleep()
调用无助于此,它们还将阻止Qt事件循环继续,而不仅仅是Python代码。在尝试等待页面完全加载,例如(使用the loadFinished signal:
另外,为了在这种情况下获得更多的调试信息,您可能需要实现QtWebKit.QWebPage.javaScriptConsoleMessage。在
相关问题 更多 >
编程相关推荐