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"没有实例,我不能访问类中的变量。

信号仅在QObjects中有意义,因为它们用于获取有关您想要传输和实现所有内部逻辑的信息类型的信息。考虑到这一点,那么您必须创建一个带有信号的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()