程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何将 python Socket.IO 与 Qt 集成大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何将 python Socket.IO 与 Qt 集成?

开发过程中遇到如何将 python Socket.IO 与 Qt 集成的问题如何解决?下面主要结合日常开发的经验,给出你关于如何将 python Socket.IO 与 Qt 集成的解决方法建议,希望对你解决如何将 python Socket.IO 与 Qt 集成有所启发或帮助;
import sys
import socketio
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QApplication


class ServerConnection(QThread):

    def __init__(self):
        QThread.__init__(self)
        self.sio = socketio.AsyncclIEnt(reconnection=True,reconnection_attempts=3,reconnection_delay=5,reconnection_delay_max=5,logger=TruE)

    'thread run function'
    def run(self) -> None:
        self.sio.connect(url="...",socketio_path="/...",transports="websocket")
        self.sio.on('connect',self.connect,namespace=NonE)
        self.sio.on('socket_connected',self.socket_connected,namespace=NonE)
        self.sio.on('connect_error',self.connect_error,namespace=NonE)
        self.sio.on('/clIEnt_Unlock',self.clIEnt_unlock_ack,namespace=NonE)

    # @sio.on('/clIEnt_unlock')
    'custom event from server,on receiving,this socketio thread needs to inform main GUI'
    async def clIEnt_unlock_ack(self,data):
            print("")
            'from here i want to call pyqt GUI main class function'

    # @sio.event
    'connection established status'
    def connect(self):
        print('Server Connection established!')

    # @sio.on("socket_connected")
    'socket connection status check'
    async def socket_connected(self,messagE):
        print("Socket Connected!",messagE)

    # @sio.event
    def connect_error(self,data):
        print('Connection error!',data)

    # @sio.on('disconnect' or 'socket_disconnected')
    def disconnect(self):
        print('disconnected!')

'main function call'
def main():
    app = QApplication(sys.argv)
    con = ServerConnection()
    con.start()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()

'GUI 类是一个 QMainWindow 应用程序,它处理我的应用程序的其他功能。 Socketio 线程连接是从 GUI 主线程触发的。基本上,GUI主启动->从GUI线程调用的Socketio线程->一旦我们在socketio线程类中接收到socketio客户端解锁事件->从clIEnt_unlock_ack,我需要触发一个信号到GUI主线程来调用一个成员函数'。请指导。

解决方法

没有必要使用线程,因为您可以使用诸如 asyncqt 之类的库,以便 Qt 与 asyncio 一起工作,避免使用 QThreads 增加不必要的复杂性

import asyncio
import sys
from functools import cached_property

from PyQt5.QtCore import pyqtSignal,QObject,Qt
from PyQt5.QtWidgets import QApplication,QLabel,QMainWindow
from asyncqt import QEventLoop

import socketio


class Client(QObject):
    connected = pyqtSignal()
    disconnected = pyqtSignal()
    error_ocurred = pyqtSignal(object,name="errorOcurred")
    data_changed = pyqtSignal(str,name="dataChanged")

    def __init__(self,parent=NonE):
        super().__init__(parent)

        self.sio.on("connect",self._handle_connect,namespace=NonE)
        self.sio.on("connect_error",self._handle_connect_error,namespace=NonE)
        self.sio.on("disconnect",self._handle_disconnect,namespace=NonE)
        self.sio.on("/client_Unlock",self.client_unlock_ack,namespace=NonE)

    @cached_property
    def sio(self):
        return socketio.AsyncClient(
            reconnection=True,reconnection_attempts=3,reconnection_delay=5,reconnection_delay_max=5,logger=True,)

    async def start(self):
        await self.sio.connect(url="...",socketio_path="/...",transports="websocket")

    def _handle_connect(self):
        self.connected.emit()

    def _handle_disconnect(self):
        self.disconnect.emit()

    def _handle_connect_error(self,data):
        self.error_ocurred.emit(data)

    def client_unlock_ack(self,data):
        self.data_changed.emit(data)


class View(QMainWindow):
    def __init__(self,parent=NonE):
        super().__init__(parent)
        self.label = QLabel(alignment=Qt.AlignCenter)
        self.setCentralWidget(self.label)
        self.resize(640,480)

    def update_data(self,messagE):
        self.label.setText(messagE)


def main():
    app = QApplication(sys.argv)
    loop = QEventLoop(app)
    asyncio.set_event_loop(loop)

    view = View()
    view.show()

    client = Client()
    client.data_changed.connect(view.update_data)

    with loop:
        asyncio.ensure_future(client.start(),loop=loop)
        loop.run_forever()


if __name__ == "__main__":
    main()

大佬总结

以上是大佬教程为你收集整理的如何将 python Socket.IO 与 Qt 集成全部内容,希望文章能够帮你解决如何将 python Socket.IO 与 Qt 集成所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。