2014-11-19 2 views
0

EDIT:PyQt QtWebKit - Возвращаемое значение из метода Python непосредственно JavaScript

Я нашел решение здесь: 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 функция работает отлично. Таким образом, параметр интерпретируется как строка. fromJStoPython функция тоже хорошо работает. Оператор печати показывает, что это QVariant.

Но функция fromPythonWithParameterBool не работает, потому что мне нужно преобразовать paramBool в строку, чтобы подключить ее. Если я это сделаю, он печатает строковое значение (но я хочу, чтобы оно было логическим). Можно ли передать логическое значение, так что в JavaScript я могу работать с ним как логическое? Если да, как вы это делаете?

И для функции fromPythonReturnValue, она не показывает ошибку, но res не определено. Зачем? Я искал для этой проблемы, но в основном примеры/уроки показывают стандартные вещи, как:

evaluateJavaScript("alert('9')";) 

Я работал с Java и SWT, и я мог бы просто вернуть значение (как в методе formPythonReturnValue). Был класс браузера, где вы могли бы реализовать свои методы для вызова, как JSBridge.

ответ

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' 
+0

Thx за ответ: D Я проверил его сейчас также со списком в качестве параметра, и он прекрасно работает! – ProgrammingIsAwsome

+0

Да, я знаю, поэтому я не удалял вопрос. Таким образом, практически невозможно передать все типы аргументов, которые оцениваются по типу JavaScript. Что приятно – ProgrammingIsAwsome

+0

@ProgrammingIsAwsome. Извините: я ответил на ваш первый комментарий, прежде чем вы его отредактировали (иногда, похоже, немного отставание). – ekhumoro

Смежные вопросы