Bonjour tout le monde !
Depuis peu je suis entrain de développer un Chat IRC pour un projet perso.
Mon problème est le suivant, je n'arrive pas à modifier le widget pour qu'il m'affiche le message reçu du serveur.
Comment je procède ?
Tout d'abord j'ai créer une fonction ("listener()") qui à pour rôle de récupérer les informations du serveur. Tout ce passe très bien côté console, les messages je les récupèrent bien et j'arrive à les afficher côté console.
Mais ensuite pour mettre à jour le widget pour qu'il puissent m'afficher ces messages, impossible.
1. Première idée
Au début je me suis dit qu'il suffit juste de créer un fonction qui se charge de modifier l'affichage et lui aussi je le met dans un thread comme ceci:
Mais là, rien, la fenêtre s'ouvre puis se ferme, je reçois les premières informations du serveur, mais comme la fenêtre crash le programme s'arrête.
2. Deuxième idée
Là je me suis dit, que si ça fonctionne pas c'est parce que la boucle de récupération de message s'active trop souvent, alors je lui ai ajouter un time.sleep(2) (un délai d'attente de 2s)
Ici comme vous pouvez le constater ça affiche les premiers messages, puis plus rien et au bout d'un certain temps ça crash encore, il est écrit (finished with exit code -1073741819 (0xC0000005))
3. Troisième idée
Là je me suis dit bon pyqt5 met à disposition qtcore qui lui à une classe Thread, avec un tuto je suis arrivé à là:
Ici crash aussi, mais cette fois ci il est écrit (finished with exit code -1073740791 (0xC0000409))
4. Quatrième idée
Arrivé à là je deviens fou xD, bon je me dit que pyqt5 a sûrement une boucle d'évènement sans quoi il serait impossible de cliquer sur le boutons ou autre, mais je ne suis pas aller plus loin car je n'ai pas trouvé de moyen de
l'implémenter
Voici le code ici:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import uic
from server import Server
import threading
import socket
import time
#VARIABLES GLOBALES
NICKNAME = "le_nom_ici"
HOST = "irc.root-me.org"
PORT = 6667
TEXTERECIVE = ""
SERVER = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SERVER.connect((HOST, PORT))
cmdNICK = f"NICK {NICKNAME}\r\n"
cmdPASS = f"PASS NADA\r\n"
cmdUSER = f"USER {NICKNAME} {NICKNAME} {NICKNAME} : _{NICKNAME}_\r\n"
data = [cmdNICK, cmdPASS, cmdUSER]
for element in data:
SERVER.send(element.encode())
def listener():
global TEXTERECIVE
while True:
text = SERVER.recv(2040)
TEXTERECIVE = text.decode("UTF-8")
print(TEXTERECIVE)
def sendServer(data):
data += "\r\n"
SERVER.send(data.encode())
class MainGui(QMainWindow):
def __init__(self):
super(MainGui, self).__init__()
uic.loadUi("GUI/main.ui", self)
self.text = ''
self.pushButton.clicked.connect(lambda: self.sendMessage(self.lineEdit.text()))
self.lineEdit.returnPressed.connect(lambda: self.sendMessage(self.lineEdit.text()))
self.show()
def sendMessage(self, msg):
if msg != '':
sendServer(msg)
self.text = self.plainTextEdit.toPlainText()
self.text += f"[{NICKNAME}]: {msg}\r\n"
self.plainTextEdit.setPlainText(self.text)
self.lineEdit.clear()
def afficheRecivedMessage(self):
self.reciver_thread = MessageReciverThread()
self.reciver_thread.start()
class MessageReciverThread(QThread):
def run(self):
while True:
if TEXTERECIVE != "":
self.text = self.plainTextEdit.toPlainText()
self.text += f"{TEXTERECIVE}\r\n"
self.plainTextEdit.setPlainText(self.text)
def main():
application = QApplication([])
main_window = MainGui()
main_window.afficheRecivedMessage()
listener_thread = threading.Thread(target=listener, daemon=True)
#reciver_trhead = threading.Thread(target=main_window.afficheRecivedMessage, daemon=True)
listener_thread.start()
#reciver_trhead.start()
application.exec_()
if __name__ == '__main__':
main() |
Je suis à court d'idées, je vous remercie d'avoir lu jusqu'ici, je suis désolé si la solution est triviale mais là je sèche sévèrement xD, désolé d'avance pour les fautes x(.
Partager