2016-07-03 5 views
0

Я новичок в python threading и Pyside. Я воздействую на создание связи между двумя компьютерами, но не может создать поток на приемной стороне Вот кодQObject: Невозможно создать дочерние элементы для родителя, который находится в разных потоках. Параметр 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 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 и не смог проверить.

Спасибо!