[英]PyQt5 QObject: Cannot create children for a parent that is in a different thread
[英]QObject:Cannot create children for a parent that is in different thread.Parent is QTextDocument,parent's thread is QThread,current thread is QThread
我是python线程和Pyside的新手。 我正在两台计算机之间进行通信,但无法在接收端创建线程这是服务器代码
from PySide import QtCore, QtGui
import sys
import receiver
import os
from socket import *
import thread
class mainWindow(QtGui.QMainWindow, receiver.Ui_MainWindow):
def __init__(self):
super(self.__class__,self).__init__()
self.setupUi(self)
self.show()
thread.start_new_thread(self.listener,())
def listener(self):
host = ""
port = 13000
buf = 1024
addr = (host, port)
UDPSock = socket(AF_INET, SOCK_DGRAM)
UDPSock.bind(addr)
(data, addr) = UDPSock.recvfrom(buf)
self.textEdit.setText(data)
UDPSock.close()
def main():
app = QtGui.QApplication(sys.argv)
mainWin = mainWindow()
mainWin.show()
app.exec_()
if __name__ == "__main__":
main()
当我从客户端发送任何消息时,程序崩溃。
线程在客户端上运行良好。 这是客户代码
from PySide import QtCore, QtGui
import sys
import main
import os
from socket import *
import thread
class mainWindow(QtGui.QMainWindow, main.Ui_MainWindow):
def __init__(self):
super(self.__class__,self).__init__()
self.setupUi(self)
self.show()
self.sendButton.clicked.connect(self.clientProcess)
def clientProcess(self):
thread.start_new_thread(self.makeClient,())
def makeClient(self):
host = "192.168.43.143"
port = 13000
addr = (host, port)
UDPSock = socket(AF_INET, SOCK_DGRAM)
data = "Successfully Completed"
UDPSock.sendto(data, addr)
UDPSock.close()
def main():
app = QtGui.QApplication(sys.argv)
mainWin = mainWindow()
mainWin.show()
app.exec_()
if __name__ == "__main__":
main()
我做错了什么?
在您的代码中,您应该只为客户端而不是服务器创建线程。 对于服务器,只需在“ listener”方法内创建一个while循环,以等待“ data”,如下所示:
while 1:
(data, addr) = UDPSock.recvfrom(buf)
if data:
self.textEdit.setText(data)
UDPSock.close()
break
else:
pass
另外,不要让两个MainWindow实例彼此继承,只需将客户端窗口实例传递给服务器即可。
这是一个有效的版本(我在Python 3.x上对其进行了测试,然后将其改回了我认为您正在使用的Python 2.x):
main.py:
from PySide import QtCore, QtGui
import sys
import receiver
import os
from socket import *
import thread
class mainWindow(QtGui.QMainWindow):
def __init__(self, receive_obj):
super(self.__class__,self).__init__()
self.setupUi(self)
self.show()
threadstart_new_thread(receive_obj.makeClient,())
self.listener()
def listener(self):
host = ""
port = 13000
buf = 1024
addr = (host, port)
UDPSock = socket(AF_INET, SOCK_DGRAM)
UDPSock.bind(addr)
while 1:
(data, addr) = UDPSock.recvfrom(buf)
if data:
self.textEdit.setText(data)
UDPSock.close()
break
else:
pass
def main():
app = QtGui.QApplication(sys.argv)
mainWin2 = receiver.mainWindow()
mainWin1 = mainWindow(mainWin2)
mainWin2.show()
mainWin1.show()
app.exec_()
if __name__ == "__main__":
main()
receiver.py:
from PySide import QtCore, QtGui
import sys
import os
from socket import *
import socket
import thread
def runClient(win):
win.makeClient()
class mainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(self.__class__,self).__init__()
self.setupUi(self)
self.show()
def clientProcess(self):
thread.start_new_thread(self.makeClient,())
def makeClient(self):
host = "192.168.43.143"
port = 13000
addr = (host, port)
UDPSock = socket.socket(AF_INET, SOCK_DGRAM)
data = "Successfully Completed"
UDPSock.sendto(data, addr)
UDPSock.close()
def main():
app = QtGui.QApplication(sys.argv)
mainWin = mainWindow()
mainWin.show()
app.exec_()
if __name__ == "__main__":
main()
让我知道这是否对您不起作用; 就像我说的那样,它可以在3.x上运行,但是我不得不将其改编为2.x,无法对其进行测试。
谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.