如何解决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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。