简体   繁体   English

python socketserver如何向外传递变量?

[英]how does python socketserver pass a variable outside?

I'm using socketserver and pyqt5 to make a udpserver, like this:我正在使用 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'))

then I use a qtbutton to start this class,like this:然后我使用 qtbutton 启动这个 class,像这样:

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

the question is,how to use the 'signal_msg' in pyqt5?问题是,如何在 pyqt5 中使用“signal_msg”? Since "UdpServer" doesn't have a instance, I can't access the variable in the class.由于“UdpServer”没有实例,我无法访问 class 中的变量。

The signals only make sense in the QObjects since they are used to obtain information about the type of information that you want to transmit and implement all the internal logic.这些信号仅在 QObjects 中有意义,因为它们用于获取有关您要传输的信息类型的信息并实现所有内部逻辑。 Considering this then you must create a QObject with a signal that has the signature of the information you send, then pass that object as an attribute of the server so that it is used in the handle method.考虑到这一点,您必须创建一个带有信号的 QObject,该信号具有您发送的信息的签名,然后将该 object 作为服务器的属性传递,以便在句柄方法中使用它。

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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM