2016-09-17 63 views
0

我用來做它通過連接對象如何在PyQT 5.7中從JavaScript訪問Python代碼?

self.page().mainFrame().addToJavaScriptWindowObject("js_interface", self.jsi) 

在5.7我做的:

self.page().setWebChannel(self.jsi) 

但我understandibly得到一個JavaScript錯誤,當我嘗試訪問公開的函數:

js: Uncaught ReferenceError: js_interface is not defined 

谷歌搜索我發現我應該使用qwebchannel.js,但我找不到文件或說明如何在任何地方使用它(有一些信息,但僅在安裝QT時提供的一些示例中,而不是PyQT)。

回答

1

看看this page。它包含一個有用的例子(在C++中,但很容易翻譯成python)。

首先,您必須使用websocket從html通信到您的應用程序,反之亦然。

然後你可以設置你的QWebChannel。

9

可以qwebchannel.js到HTML頁面使用腳本標籤包括:

<script src="qrc:///qtwebchannel/qwebchannel.js"></script> 

然後,創建蟒側的網絡渠道:

from PyQt5.QtCore import QObject, pyqtSlot 
from PyQt5.QtWebChannel import QWebChannel 
from PyQt5.QtWebEngineWidgets import QWebEngineView 

class CallHandler(QObject): 
    @pyqtSlot() 
    def test(self): 
     print('call received') 

view = QWebEngineView() 
channel = QWebChannel() 
handler = CallHandler() 
channel.registerObject('handler', handler) 
view.page().setWebChannel(channel) 

JS代碼與交互網絡頻道:

new QWebChannel(qt.webChannelTransport, function (channel) { 
    window.handler = channel.objects.handler; 
    window.handler.test(); 
}); 
+2

另外:請確保'channel','handler'等不被垃圾回收。我正在用class-method初始化它們,我無法弄清楚它爲什麼不起作用,甚至被隔離。技巧是在類中保留對'channel'和'handler'的引用(例如'self.handler = CallHandler()'etc – devsnd

0

我覺得這很大d在PyQT5.9 +中,JS不能直接與Python進行通信,就像它用於「addToJavaScriptWindowObject」命令一樣。 並使用websockets ...如果防火牆很重,並且所有端口都被阻塞,該怎麼辦?

我想我會依靠簡單的回調(從Python到JS的長池類型檢查更改/命令)的方法,並沒有QTWebChannel的用法。

相關問題