2017-04-11 14 views
0

私はQwebengineviewを開くpyqt5アプリケーションで作業しています。また、QWebchannelにハンドラを添付して、javascriptとpythonのメソッド間で通信し、QWebengineviewに設定します。Pythonから返された値はJavaScriptで利用できません

すべてが期待どおりに機能しています。上記のコードはHTMLを読み込み、CallHandlerのtest()メソッドはjavascriptから呼び出されます。そして、それはスムーズに走った。 しかし、javascriptからgetScriptsPath()メソッドへの呼び出しが行われると、関数は呼び出しを受け取りますが、何も返しません。

以下は、それぞれPythonコードとHTMLコードです。

import os 
import sys 
from PyQt5 import QtCore, QtGui 
from PyQt5.QtCore import QUrl, QObject, pyqtSlot 
from PyQt5.QtWidgets import QApplication, QWidget 
from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWebEngineWidgets import QWebEngineView 
from PyQt5.QtWebChannel import QWebChannel 

class CallHandler(QObject): 
    trigger = pyqtSignal(str) 
    @pyqtSlot() 
    def test(self): 
     print('call received') 

    @QtCore.pyqtSlot(int, result=str) 
    def getScriptsPath(self, someNumberToTest): 
     file_path = os.path.dirname(os.path.abspath(__file__)) 
     print('call received for path', file_path) 
     return file_path 

class Window(QWidget): 
    """docstring for Window""" 
    def __init__(self): 
     super(Window, self).__init__() 
     ##channel setting 
     self.channel = QWebChannel() 
     self.handler = CallHandler(self) 
     self.channel.registerObject('handler', self.handler) 


     self.view = QWebEngineView(self) 
     self.view.page().setWebChannel(self.channel) 

     file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "test.html")) 
     local_url = QUrl.fromLocalFile(file_path) 
     self.view.load(local_url) 

def main(): 
    app = QApplication(sys.argv) 
    window = Window() 
    # window.showFullScreen() 
    window.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    main() 

HTMLFILE

<html> 
<head> 

</head> 

<body> 
    <center> 
    <script src="qrc:///qtwebchannel/qwebchannel.js"></script> 
    <script language="JavaScript"> 
    var xyz = "HI"; 

    window.onload = function(){ 
      new QWebChannel(qt.webChannelTransport, function (channel) { 
      window.handler = channel.objects.handler; 
      //testing handler object by calling python method. 
      handler.test(); 


      handler.trigger.connect(function(msg){ 
      console.log(msg); 
      }); 
     }); 
    } 

    var getScriptsPath = function(){ 
     file_path = handler.getScriptsPath(); 
     //Logging the recieved value which is coming out as "undefined" 
     console.log(file_path); 
    }; 

    </script> 
    <button onClick="getScriptsPath()">print path</button> 
    </br> 
    <div id="test"> 
     <p>HI</p> 
    </div> 
    </center> 
</body></html> 

私はhandler.getScriptsPath()の返り値はJavaScriptで使用できない理由を解読することはできませんよ。 getScriptsPathにあなたの関数呼び出しから

答えて

0

結果は、あなたのハンドラにコールバック関数を渡す必要がありますので、その結果、例えば:

handler.getScriptsPath(function(file_path) { 
    console.log(file_path); 
}); 
を取得するために、asyncronously返されます
関連する問題