从 js QWebEngineView 获取变量到 python
Get variable from js QWebEngineView to python
从 js QWebEngineView 获取变量到 python。
我正在使用 PyQt5 和 python3 的 QT Designer,我正在使用 QWebEngineView 加载 html 和 js。 html里面有一个输入和一个按钮,按下按钮执行一个js函数,将输入的值保存在一个变量中。
如何从 js 中获取该变量并转到 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>
如果我认为的地方有误,请随时指出以提供合适的解决方案。
从 js QWebEngineView 获取变量到 python。
我正在使用 PyQt5 和 python3 的 QT Designer,我正在使用 QWebEngineView 加载 html 和 js。 html里面有一个输入和一个按钮,按下按钮执行一个js函数,将输入的值保存在一个变量中。
如何从 js 中获取该变量并转到 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>
如果我认为的地方有误,请随时指出以提供合适的解决方案。