pyqt5 中python如何通过Qtwebchannel主动发消息给web前端,项目中python端产生的日志要实时传送给web端,怎么不通过触发按钮把消息传给web端呢?
27条回答 默认 最新
关注 🕒下午好,题主!目前:🟢[在线]
📢参考通义千问、由郭老师整理提供!
📣今日诗号:春风又绿江南岸,明月何时照我还。PyQt5 通过 QtWebChannel 主动发送消息给 Web 前端
以下代码示例演示了如何使用 PyQt5 和 QtWebChannel 主动将 Python 端的日志实时发送到 Web 前端:
1. Python 代码 (main.py):
import sys import logging from PyQt5.QtWidgets import QApplication from PyQt5.QtWebEngineWidgets import QWebEngineView from PyQt5.QtCore import QUrl, QObject, pyqtSignal, QTimer from PyQt5.QtWebChannel import QWebChannel class Logger(QObject): logChanged = pyqtSignal(str) def __init__(self, parent=None): super().__init__(parent) def write(self, message): # 捕获日志并发送信号 self.logChanged.emit(message) class Backend(QObject): def __init__(self): super().__init__() self.logger = Logger() # 设置日志级别和格式 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # 将 Python logger 重定向到自定义 logger handler = logging.StreamHandler(self.logger) logging.getLogger().addHandler(handler) @pyqtSlot() def start_logging(self): # 模拟生成日志 QTimer.singleShot(1000, lambda: logging.info("This is a test log message.")) QTimer.singleShot(3000, lambda: logging.warning("This is a warning message.")) QTimer.singleShot(5000, lambda: logging.error("This is an error message.")) if __name__ == '__main__': app = QApplication(sys.argv) view = QWebEngineView() # 创建后端对象 backend = Backend() # 创建 QtWebChannel 并设置对象名 channel = QWebChannel() channel.registerObject('backend', backend) view.page().setWebChannel(channel) # 加载 HTML 页面 view.load(QUrl.fromLocalFile('index.html')) view.show() sys.exit(app.exec_())
2. HTML 代码 (index.html):
<!DOCTYPE html> <html> <head> <title>QtWebChannel Example</title> </head> <body> <h1>Log Messages:</h1> <div id="log-container"></div> <script src="qrc:///qtwebchannel/qwebchannel.js"></script> <script> var logContainer = document.getElementById('log-container'); new QWebChannel(qt.webChannelTransport, function (channel) { var backend = channel.objects.backend; // 连接信号 backend.logChanged.connect(function (message) { var logEntry = document.createElement('p'); logEntry.textContent = message; logContainer.appendChild(logEntry); }); // 开始记录日志 backend.start_logging(); }); </script> </body> </html>
代码解释:
-
Python 端:
- 创建了一个
Logger
类,重写了write()
方法,用于捕获日志信息并发送信号。 - 创建了一个
Backend
类,包含了Logger
对象和模拟生成日志的逻辑。 - 使用
QWebChannel
将Backend
对象注册到 JavaScript 中。 - 使用
QTimer
模拟定时生成不同级别的日志信息。
- 创建了一个
-
HTML 端:
- 使用
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
引入 QtWebChannel 库。 - 创建一个
QWebChannel
对象,获取 Python 端注册的对象。 - 连接 Python 端的
logChanged
信号,并在接收到信号时将日志信息添加到页面中。 - 调用
backend.start_logging()
方法开始记录日志。
- 使用
运行结果:
运行代码后,浏览器会打开一个页面,并实时显示 Python 端生成的日志信息。
总结:
通过 QtWebChannel,我们可以轻松地实现 Python 和 JavaScript 之间的双向通信。本例中,我们通过自定义 Logger 和信号机制实现了 Python 端主动将日志信息发送到 Web 前端,实现了实时日志传输的功能。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用-
悬赏问题
- ¥15 无法输出helloworld
- ¥15 高通uboot 打印ubi init err 22
- ¥20 PDF元数据中的XMP媒体管理属性
- ¥15 R语言中lasso回归报错
- ¥15 网站突然不能访问了,上午还好好的
- ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
- ¥15 semrush,SEO,内嵌网站,api
- ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
- ¥15 振荡电路,ADS仿真
- ¥15 关于#c语言#的问题,请各位专家解答!