繁体   English   中英

QObject:无法为处于不同线程中的父级创建子级。父级是QTextDocument,父级的线程是QThread,当前线程是QThread

[英]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.

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