python socketserver是如何向外传一个变量的?

问题描述

我正在使用 socketserver 和 pyqt5 来制作一个 udpserver,就像这样:

class UdpServer(socketserver.BaseRequestHandler):
    signal_msg=pyqtSignal(str)
    def handle(self):
        data =self.request[0]
        signal_msg.emit(data.decode('utf-8'))

然后我使用一个 qtbutton 来启动这个类,就像这样:

udpserver=socketserver.ThreadingUDPServer(('127.0.0.1',8081),UdpServer)
def udpthr(): 
    udpserver.serve_forever()
threading.Thread(target=udpthr,args=()).start()

问题是,如何在pyqt5中使用'signal_msg'?由于“UdpServer”没有实例,我无法访问类中的变量。

解决方法

这些信号只在 QObject 中有意义,因为它们用于获取有关您要传输的信息类型的信息并实现所有内部逻辑。考虑到这一点,您必须创建一个 QObject 并带有一个信号,该信号具有您发送的信息的签名,然后将该对象作为服务器的属性传递,以便在 handle 方法中使用它。

import sys
import socketserver
import threading

from PyQt5 import QtCore,QtGui,QtWidgets


class Bridge(QtCore.QObject):
    dataChanged = QtCore.pyqtSignal(str)


class UDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        data = str(self.request[0],"ascii")
        self.server.bridge.dataChanged.emit(data)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super().__init__(parent)

        self.label = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
        self.label.setFont(QtGui.QFont("Arial",20))

        self.setCentralWidget(self.label)
        self.resize(640,480)

    @QtCore.pyqtSlot(str)
    def update_text(self,text):
        self.label.setText(text)


def main():
    app = QtWidgets.QApplication(sys.argv)

    bridge = Bridge()

    w = MainWindow()
    w.show()

    HOST,PORT = "127.0.0.1",8081
    server = socketserver.ThreadingUDPServer((HOST,PORT),UDPHandler)
    ip,port = server.server_address
    print(ip,port)
    server.bridge = bridge

    bridge.dataChanged.connect(w.update_text)

    server_thread = threading.Thread(target=server.serve_forever)
    server_thread.daemon = True
    server_thread.start()

    ret = app.exec_()

    server.server_close()

    sys.exit(ret)


if __name__ == "__main__":
    main()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...