Hola a todos, estoy tratando de crear un chat en Python usando como Interfaz grafica QT, tengo el siguientes codigo:
server.py
Código Python:
Ver originalimport asyncore, socket
clients = {}
class MainSocketServer(asyncore.dispatcher):
def __init__(self, puerto):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.bind(('', puerto))
self.listen(10)
def handle_accept(self):
newSocket, address = self.accept()
clients[address] = newSocket
print "Conectado desde", address
SecondSocketServer(newSocket)
class SecondSocketServer(asyncore.dispatcher_with_send):
def handle_read(self):
mensaje = self.recv(1000)
if mensaje:
clientes = clients.values()
for cliente in clientes:
cliente.send(mensaje+'\n')
else:
self.close()
def handle_close(self):
print "Desconectado desde", self.getpeername()
del clients[self.getpeername()]
MainSocketServer(9090)
asyncore.loop()
client.py
Código Python:
Ver originalfrom PySide import QtGui, QtCore
import socket, thread, sys
socket_cliente = socket.socket()
socket_cliente.connect(('', 9090))
class Window(QtGui.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.socket()
self.browser = QtGui.QTextBrowser()
self.browser.backwardAvailable
self.textEdit = QtGui.QTextEdit()
self.textEdit.setMaximumSize(QtCore.QSize(400, 60))
self.connect(self.browser, QtCore.SIGNAL("returnPressed()"), self.enviar_mensaje)
enviarB = QtGui.QPushButton("Enviar")
enviarB.setMaximumSize(QtCore.QSize(400, 60))
enviarB.clicked.connect(self.enviar_mensaje)
layoutINlayout = QtGui.QHBoxLayout()
layoutINlayout.addWidget(self.textEdit)
layoutINlayout.addWidget(enviarB)
widget = QtGui.QWidget()
self.setCentralWidget(widget)
self.layout = QtGui.QVBoxLayout()
self.layout.addWidget(self.browser)
mainWindow = QtGui.QVBoxLayout()
mainWindow.addLayout(self.layout)
mainWindow.addLayout(layoutINlayout)
widget.setLayout(mainWindow)
self.setWindowFlags(QtCore.Qt.WindowTitleHint)
def enviar_mensaje(self):
mensaje = self.textEdit.toPlainText()
socket_cliente.send(mensaje)
def add_mensaje(self, mensaje):
self.browser.setText(mensaje)
def socket(self):
def loop():
while True:
mensaje = socket_cliente.recv(1000)
if mensaje:
self.add_mensaje(mensaje)
thread.start_new_thread(loop, ())
app = QtGui.QApplication(sys.argv)
w = Window()
w.show()
app.exec_()
El servidor en realidad no da ningun problema, pero el cliente me da el siguiente error:
Código:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTextDocument(0x95e29f0), parent's thread is QThread(0x9140ea0), current thread is QThread(0xafe009a0)
Violación de segmento (`core' generado)
Estuve revisando y este error da en la linea 53 de client.py al tratar de acceder a la funcion add_mensaje de la clase Window, no se si esque el thread no tiene permiso para acceder a las funciones de la clase o algo asi porque si cambio la linea 53 por "print mensaje", me imprime bien el mensaje que llega.
Espero me puedan ayudar con esto