2016-07-03 33 views
0

我是python線程和Pyside的新手。我的工作是使兩臺計算機之間的通信,但不能接收側 這裏創建一個線程是服務器代碼QObject:無法爲不同線程的父項創建子項.Parent爲QTextDocument,父線程爲QThread,當前線程爲QThread

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() 

我在做什麼錯?

回答

0

在你的代碼中,你應該只爲客戶端而不是服務器創建一個線程。對於服務器,只需將「偵聽器」方法中創建一個while循環等待「數據」爲這樣:

while 1: 
    (data, addr) = UDPSock.recvfrom(buf) 
    if data: 
     self.textEdit.setText(data) 
     UDPSock.close() 
     break 
    else: 
     pass 

而且,不是具有兩個主窗口實例相互繼承,簡單地傳遞客戶端窗口實例到服務器。

這裏是一個工作版本(我測試的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,並且無法測試它。

謝謝!

相關問題