[英]Get variable from js QWebEngineView to python
從 js QWebEngineView 獲取變量到 python。
我正在使用 PyQt5 和 QT 的 python3 設計器,我正在使用 QWebEngineView 加載 html 和 js。 html內部有一個輸入和一個按鈕,按下按鈕執行一個js function,它將輸入的值保存在一個變量中。
如何從 js 和 go 到 python 中獲取該變量?
代碼 HTML:
<input id="input">
<button id="button" onclick="x()"></button>
<script>
function x() {
var a = document.getElementById("input").value;
}
</script>
代碼 Python:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(449, 391)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("favicon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
Form.setWindowIcon(icon)
Form.setWindowOpacity(0.8)
self.webEngineView = QtWebEngineWidgets.QWebEngineView(Form)
self.webEngineView.setGeometry(QtCore.QRect(-1, 0, 451, 391))
self.webEngineView.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
self.webEngineView.setStyleSheet("width: 100%")
self.webEngineView.setUrl(QtCore.QUrl("file:///C:/xampp/htdocs/indexx.html"))
self.webEngineView.setObjectName("webEngineView")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Bancus"))
from PyQt5 import QtWebEngineWidgets
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
您的問題的描述不清楚,但假設您想在按下按鈕時將文本放置在 python 的輸入中,並且您可以修改 HTML,那么可能的解決方案是使用 QWebChannel:
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets, QtWebChannel
class Backend(QtCore.QObject):
valueChanged = QtCore.pyqtSignal(str)
def __init__(self, parent=None):
super().__init__(parent)
self._value = ""
@QtCore.pyqtProperty(str)
def value(self):
return self._value
@value.setter
def value(self, v):
self._value = v
self.valueChanged.emit(v)
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.webEngineView = QtWebEngineWidgets.QWebEngineView()
self.label = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.webEngineView, stretch=1)
lay.addWidget(self.label, stretch=1)
backend = Backend(self)
backend.valueChanged.connect(self.label.setText)
backend.valueChanged.connect(self.foo_function)
self.channel = QtWebChannel.QWebChannel()
self.channel.registerObject("backend", backend)
self.webEngineView.page().setWebChannel(self.channel)
path = "C:/xampp/htdocs/indexx.html"
self.webEngineView.setUrl(QtCore.QUrl.fromLocalFile(path))
@QtCore.pyqtSlot(str)
def foo_function(self, value):
print(value)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
</head>
<body>
<input id="input">
<button id="button">Click me</button>
</body>
<script>
var backend = null;
new QWebChannel(qt.webChannelTransport, function (channel) {
backend = channel.objects.backend;
});
document.getElementById("button").addEventListener("click", function(){
backend.value = document.getElementById("input").value;
});
</script>
</html>
如果我認為某處有問題,請隨時指出以提供合適的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.