Ich bau grad für ein Schulprojekt einen kleinen Chat mit Server und Client.
Der Server funktioniert soweit. Der Client kann sich anmelden mit seiner IP und die Nachrichten werden auch brav an alle Clients verschickt.
Im Clienten sieht das so aus:
Die Hauptklasse hat die GUI (kann ja nur die bei Qt).
Und in einem Thread läuft ein kleiner Server der auf einem anderen Port die Nachrichten empfängt, welcher der eigentliche Server an alle Clients schickt.
Jetzt hab ich das so gemacht, das dieser "kleine Clientserver" ein Signal sendet ("newData()"), sobald was reinkommt und eine Variable self.newdaten mit dem Text beschreibt.
In der Hauptklasse ist ein Slot welcher dann in eine Funktion springt und den Text in eine Textarea appenden soll.
Ich lass zum Test self.newdaten auch in der Konsole ausgeben (da funktioniert es! Die Daten kommen also an...)
Aber die GUI macht nix...ich weiß das bei Qt nur die Hauptklasse GUI machen kann, aber ist durch das Signal/Slot gemache das nicht eh schon beachtet worden?
Hier mal der Code des Clienten:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: ISO-8859-1 -*-
'''
Import von notwendigen Bibliotheken und Designdateien
'''
import sys,os,time,urllib, webbrowser,math
from PyQt4 import QtGui, QtCore, QtWebKit
import threading
import socket
from PyQt4 import uic
from PyQt4 import QtGui as qg
from PyQt4 import QtCore as qc
from PyQt4.QtTest import QTest as qt
class ChatClient(QtGui.QMainWindow):
def __init__(self, parent=None):
super(ChatClient, self).__init__(parent)
uic.loadUi(os.path.dirname(os.path.abspath(__file__))+"/client.ui", self) #Designdatei
'''
Aktueller Ordner in Variable speichern
'''
self.pfad = os.path.dirname(os.path.abspath(__file__))+"/"
'''
Slots und Signals setzten
'''
#self.connect(self.addWP,QtCore.SIGNAL("clicked()"),self.addCache)
self.connect(self.sendText,QtCore.SIGNAL("clicked()"),self.sendTextToServer)
self.connect(self, QtCore.SIGNAL('newData()'), self.newText) #Slot
'''
ip abfragen
'''
#self.ip, ok = QtGui.QInputDialog.getText(self, 'Serveradresse?', 'ServerIP:')
#self.nickname, ok = QtGui.QInputDialog.getText(self, 'Nick?', 'Nickname:')
#self.ip = int(self.ip)
self.ip="localhost"
self.nickname="devi"
self.port = 50000
'''
connect
'''
self.loginOnServer()
def openSocket(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.chatText.append("Socket open...")
print threading.active_count()
def sendTextToServer(self):
self.openSocket()
self.socket.sendto("["+self.nickname+"] "+self.userText.text(), (self.ip, self.port))
self.chatText.append("Send text ["+self.nickname+"] "+self.userText.text())
self.socket.close()
def loginOnServer(self):
self.openSocket()
self.socket.sendto("/login", (self.ip, self.port))
self.socket.close()
self.chatText.append("Login on server "+str(self.ip)+":"+str(self.port)+"...done")
self.chatText.append("Ready to chat...")
def newText(self): #Funktion die den Text appenden soll
print "newdaten:"+self.newdaten #Funktioniert!
self.chatText.append(self.newdaten) #Funktioniert nicht...
print "newtext-ende"
def run(self):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.bind(("", 50001))
while True:
daten, addr = s.recvfrom(1024)
print "Empfange: %s" % (daten) #Funktioniert!
self.newdaten = daten
self.emit(QtCore.SIGNAL('newData()')) #Signal
finally:
s.close()
app = QtGui.QApplication(sys.argv)
dialog = ChatClient()
dialog.show()
th = threading.Thread(target = ChatClient().run)
th.start()
sys.exit(app.exec_())
Gruß!
Alex