[英]ValueError from socketserver on close event using PySide2
前几天,当我试图找出一种将数据发送到已经运行的PyQt实例的方法时,我找到了这个答案 ,并且效果很好,但是我只是在弄混PySide2并尝试了代码,关闭时给出了错误。 它在PyQt5上可以完全正常工作,但是在使用PySide和PySide2关闭时会给出相同的错误。 有人知道为什么吗? 它说这是一个ValueError,但我不知道。 我正在使用Python 3.6。
客户端
import socket
IP, PORT = '127.0.0.1', 62236
def send(data):
SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SOCKET.connect((IP, PORT))
SOCKET.send(data)
SOCKET.close()
test_text = b'testing'
send(test_text)
Server.py PyQt5
import socketserver as SocketServer
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
IP, PORT = '127.0.0.1', 62236
app = QApplication([])
class Emitter(QObject):
signal = pyqtSignal(str)
class Handler(SocketServer.BaseRequestHandler):
emitter = Emitter()
def handle(self):
self.emitter.signal.emit(self.request.recv(1024).decode('utf-8'))
class Thread(QThread):
def __init__(self, target, parent=None):
QThread.__init__(self, parent)
self.target = target
def run(self):
while True:
self.target()
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
Handler.emitter.signal.connect(self.onEmit)
self.server = SocketServer.TCPServer((IP, PORT), Handler)
thread = Thread(target=self.server.handle_request)
thread.start()
self.setLayout(QVBoxLayout())
self.label = QLabel('somewhere over the rainbow')
self.layout().addWidget(self.label)
self.show()
def closeEvent(self, event):
self.server.server_close()
event.accept()
def onEmit(self, arg):
self.label.setText(str(arg))
dialog = Dialog()
app.exec_()
Server.py PySide2
import socketserver as SocketServer
from PySide2.QtWidgets import *
from PySide2.QtCore import *
IP, PORT = '127.0.0.1', 62236
app = QApplication([])
class Emitter(QObject):
signal = Signal(str)
class Handler(SocketServer.BaseRequestHandler):
emitter = Emitter()
def handle(self):
self.emitter.signal.emit(self.request.recv(1024).decode('utf-8'))
class Thread(QThread):
def __init__(self, target, parent=None):
QThread.__init__(self, parent)
self.target = target
def run(self):
while True:
self.target()
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
Handler.emitter.signal.connect(self.onEmit)
self.server = SocketServer.TCPServer((IP, PORT), Handler)
thread = Thread(target=self.server.handle_request)
thread.start()
self.setLayout(QVBoxLayout())
self.label = QLabel('somewhere over the rainbow')
self.layout().addWidget(self.label)
self.show()
def closeEvent(self, event):
self.server.server_close()
event.accept()
def onEmit(self, arg):
self.label.setText(str(arg))
dialog = Dialog()
app.exec_()
这是错误。
Traceback (most recent call last):
File "C:/Users/Rich/PycharmProjects/TestProject/Server.py", line 76, in run
self.target()
File "C:\python36\lib\socketserver.py", line 292, in handle_request
selector.register(self, selectors.EVENT_READ)
File "C:\python36\lib\selectors.py", line 299, in register
key = super().register(fileobj, events, data)
File "C:\python36\lib\selectors.py", line 237, in register
key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data)
File "C:\python36\lib\selectors.py", line 224, in _fileobj_lookup
return _fileobj_to_fd(fileobj)
File "C:\python36\lib\selectors.py", line 41, in _fileobj_to_fd
raise ValueError("Invalid file descriptor: {}".format(fd))
ValueError: Invalid file descriptor: -1
问题解决了。 不得不终止线程
self.thread.terminate()
打电话之前
self.server.server_close()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.