修改
我在这里找到了一个解决方案: how do I correctly return values from pyqt to JavaScript?
我会先发布代码:
Python代码:
class JSBridge(QObject):
def __init__(self, parent=None):
super(JSBridge, self).__init__(parent)
@pyqtSlot(bool)
def fromJStoPython(self, param):
print param
print param.toBool()
@pyqtSlot()
def returnValue()
return "hello world"
class another():
...
view = QWebView()
frame = view.page().mainFrame()
param = "blabla"
frame.evaluateJavaScript("printIt('" + param + "');")
paramBool = True
frame.evaluateJavaScript("fromPythonWithParameterBool('" + paramBool + "');")
JavaScript的:
function printIt(param)
{
alert(param);
}
function toPython()
{
jsBridgeInst.fromJStoPython(true);
}
// now here functions I've questions about:
function fromPythonWithParameterBool(param)
{
alert(param);
}
function fromPythonReturnValue()
{
res = jsBridgeInst.returnValue();
alert(res);
}
现在问我的问题:
printIt
功能正常。所以param被解释为String。
fromJStoPython
函数也可以正常工作。 print语句显示为QVariant
。
但是fromPythonWithParameterBool
函数不起作用,因为我必须将paramBool
转换为字符串才能连接它。如果我这样做,它打印字符串值(但我希望它是布尔值)。是否可以传递布尔值,以便在JavaScript中我可以将它作为布尔值使用?如果是的话,你是怎么做到的?
对于fromPythonReturnValue
函数,它不会显示错误,但res
未定义。为什么?
我正在寻找这个问题,但大多数示例/教程都显示标准的东西,如:
evaluateJavaScript("alert('9')";)
我使用过Java和SWT,在那里我只需返回一个值(如formPythonReturnValue
方法)。有一个Browser类,您可以在其中实现调用方法,就像JSBridge一样。
答案 0 :(得分:0)
fromPythonWithParameterBool
不起作用,因为您没有生成可以作为javascript计算的输入字符串。
你需要做的是这样的事情:
>>> script = 'fromPythonWithParameterBool(%s);' % str(bool(paramBool)).lower()
>>> print(script)
fromPythonWithParameterBool(true);
因此,结果字符串现在是有效javascript的片段。
fromPythonReturnValue
的问题(正如您已经发现的那样)是您没有指定返回值的类型。必须使用pyqtSlot decorator:
@pyqtSlot(result=str)
def returnValue(self):
return 'hello world'