基本思路就是在pyqt界面中直接加载html文件,并与html进行交互,参考的文件我已经找不到了,这里我放三个编写好的例子,里面也做了写解释说明,可根据这些例子进行测试,使用。
后端部分:
#! /usr/bin/env
# -*- coding: utf-8 -*-
# webview.py
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QObject, pyqtSlot, QUrl
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView
import sys
class Print(QObject):
# pyqtSlot,中文网络上大多称其为槽。作用是接收网页发起的信号
@pyqtSlot(str, result=str)
def print(self, content):
print('输出文本:',content) # 对接收到的内容进行处理,比如调用打印机进行打印等等。此处略去,只在bash中显示接收到的消息
return content
if __name__ == '__main__':
app = QApplication(sys.argv)
browser = QWebEngineView() # 新增一个浏览器引擎
browser.setWindowTitle('QWebChannel交互Demo')
browser.resize(900, 600)
channel = QWebChannel() # 增加一个通信中需要用到的频道
printer = Print() # 通信过程中需要使用到的功能类
channel.registerObject('printer', printer) # 将功能类注册到频道中,注册名可以任意,但将在网页中作为标识
browser.page().setWebChannel(channel) # 在浏览器中设置该频道
url_string = "file:///D:/TY_75Stability/mxh_work/pyqt_work/demo13.html" # 内置的网页地址,此处我采用的是本地的。远程同样可以使用。
browser.load(QUrl(url_string))
browser.show()
sys.exit(app.exec_())
前端部分:
QWebChannel交互Demo
后端部分:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QObject, pyqtSlot, QUrl
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView
class CallHandler(QObject):
@pyqtSlot(result=str)
def myHello(self):
view.page().runJavaScript('uptext("hello, Pythongjhkkkk");')
print('call received')
return 'hello, Python'
@pyqtSlot(str, result=str)
def myTest(self, test):
print('test is',test)
return '返回前端结果'
if __name__ == '__main__':
app = QApplication(sys.argv)
view = QWebEngineView()
channel = QWebChannel()
handler = CallHandler()
channel.registerObject('pyjs', handler)##前者是str,后者是一个QObject(里面放着需要调用的函数)
view.page().setWebChannel(channel)
url_string = "file:///D:/TY_75Stability/mxh_work/pyqt_work/demo15.html"
view.load(QUrl(url_string))
view.show()
sys.exit(app.exec_())
前端部分:
QWebChannel测试
this is test !
测试
这个案例后端有两个文件,一个是qt_designer涉及的.py,一个是主界面文件,
后端主文件:
import os
import sys
from PyQt5.QtCore import QUrl, pyqtSlot, QObject, pyqtSignal
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWidgets import QMainWindow, QApplication
from demo14_1 import Ui_MainWindow
class TInteractObj(QObject):
"""
一个槽函数供js调用(内部最终将js的调用转化为了信号),
一个信号供js绑定,
这个一个交互对象最基本的组成部分.
"""
# 定义信号,该信号会在js中绑定一个js方法.
sig_send_to_js = pyqtSignal(str)
def __init__(self, parent=None):
super().__init__(parent)
# 交互对象接收到js调用后执行的回调函数.
self.receive_str_from_js_callback = None
# str表示接收str类型的信号,信号是从js发出的.可以出传递的参数类型有很多种:str、int、list、object、float、tuple、dict等等
@pyqtSlot(str)
def receive_str_from_js(self, str):
print('接受消息str is ',str)
self.receive_str_from_js_callback(str)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.index = (os.path.split(os.path.realpath(__file__))[0]) + "/demo14.html"
self.webview.load(QUrl.fromLocalFile(self.index))
self.init_channel()
def init_channel(self):
"""
为webview绑定交互对象
"""
self.interact_obj = TInteractObj(self)
self.interact_obj.receive_str_from_js_callback = self.receive_data
channel = QWebChannel(self.webview.page())
# interact_obj 为交互对象的名字,js中使用.
channel.registerObject("interact_obj", self.interact_obj)
self.webview.page().setWebChannel(channel)
def receive_data(self, data):
self.textBrowser.setText(data)
@pyqtSlot()
def on_pushButton_clicked(self):
if not self.textBrowser.toPlainText():
return
# 这个信号是在js中和一个js方法绑定的,所以发射这个信号时会执行对应的js方法.
print('pyqt发送消息')
self.interact_obj.sig_send_to_js.emit(self.textBrowser.toPlainText())
self.textBrowser.clear()
if __name__ == '__main__':
app = QApplication(sys.argv)
ui = MainWindow()
ui.show()
sys.exit(app.exec_())
后端界面文件:
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 570)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser.setObjectName("textBrowser")
self.textBrowser.setReadOnly(False)
self.gridLayout.addWidget(self.textBrowser, 0, 0, 1, 1)
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.gridLayout.addWidget(self.pushButton, 1, 0, 1, 1)
self.webview = QWebEngineView(self.centralwidget)
self.webview.setObjectName("webview")
self.webview.setMinimumWidth(400)
self.gridLayout.addWidget(self.webview, 0, 1, 2, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "同步到web"))
前端界面:
QWebChannel测试