junboli 2024-07-18 17:51 采纳率: 66.7%
浏览 14
已结题

pyqt5 中python如何通过Qtwebchannel主动发消息给web前端

pyqt5 中python如何通过Qtwebchannel主动发消息给web前端,项目中python端产生的日志要实时传送给web端,怎么不通过触发按钮把消息传给web端呢?

  • 写回答

27条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-07-18 17:59
    关注

    🕒下午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:春风又绿江南岸,明月何时照我还。

    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>
    

    代码解释:

    1. Python 端:

      • 创建了一个 Logger 类,重写了 write() 方法,用于捕获日志信息并发送信号。
      • 创建了一个 Backend 类,包含了 Logger 对象和模拟生成日志的逻辑。
      • 使用 QWebChannelBackend 对象注册到 JavaScript 中。
      • 使用 QTimer 模拟定时生成不同级别的日志信息。
    2. HTML 端:

      • 使用 <script src="qrc:///qtwebchannel/qwebchannel.js"></script> 引入 QtWebChannel 库。
      • 创建一个 QWebChannel 对象,获取 Python 端注册的对象。
      • 连接 Python 端的 logChanged 信号,并在接收到信号时将日志信息添加到页面中。
      • 调用 backend.start_logging() 方法开始记录日志。

    运行结果:

    运行代码后,浏览器会打开一个页面,并实时显示 Python 端生成的日志信息。

    总结:

    通过 QtWebChannel,我们可以轻松地实现 Python 和 JavaScript 之间的双向通信。本例中,我们通过自定义 Logger 和信号机制实现了 Python 端主动将日志信息发送到 Web 前端,实现了实时日志传输的功能。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(26条)

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 已采纳回答 7月25日
  • 创建了问题 7月18日

悬赏问题

  • ¥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语言#的问题,请各位专家解答!