2016-07-03 1 views
0

私はPythonスレッドとPysideには初めてです。私は2台のコンピュータ間の通信を行うことに取り組んでいますが、私はクライアント、プログラムがクラッシュから任意のメッセージを送信すると、サーバー・コードは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 

を、むしろインスタンスが互いに継承メインウィンドウ2を有するよりも、単にクライアントのウィンドウを渡しますインスタンスをサーバーに追加します。

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

は作業バージョン(Iは、Python 3.xの上でそれをテストしてから戻って、私はあなたが使用していたと仮定のPython 2.xのためにそれを適応さ)であります

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に適合させなければならず、テストできませんでした。

ありがとうございます!

関連する問題