Bonjour,
nous sommes actuellement en train de développer une plate-forme de jeux en ligne permettant à des gens de jouer aux échecs, aux dames, etc... Nous utilisons une architecture client serveur.
Pour recevoir les communications du serveur, nous avons centralisé la réception dans une fonction recvClient.
Cette fonction est lancée toutes les 0.2 secondes à l'aide d'un QTimer et regarde si le serveur tente de communiquer. Le message réceptionné est ensuite envoyé dans la fonction analyseur qui aura pour but de lancer les fonctions adéquates.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 def recvClient(connexionAvecServeur, fenetre): connexionAvecServeur.setblocking(0) message = connexion_serveur.recevoirMessageServeur(connexionAvecServeur) if len(message) >= 1: print(message) analyseur.analyseur(connexionAvecServeur, message, fenetre)
Exemple : on reçoit "raffraichirConnectes", alors analyseur lancera fenetre.raffraichirConnectes().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 timerRecv = QtCore.QTimer() app.connect(timerRecv, QtCore.SIGNAL("timeout()"), lambda connexion=connexionAvecServeur, fen = fenetre: recvClient(connexion, fenetre)) timerRecv.setInterval(0.2) timerRecv.start()
Le problème étant que le travail de l'analyseur se faisant sur une variable fenetre, elle doit pouvoir détecter un changement de fenêtre. La variable est donnée en paramètre initial du QTimer.
L'idéal serait de pouvoir dire au programme "arrête de lancer recvClient avec cette variable fenêtre, utilise plutôt celle-ci !".
Voici la structure globale de notre fichier principal :
Voici le code de l'analyseur. Ok, c'est pas encore rangé et c'est vraiment pas optimisé !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #!/usr/bin/python # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui import platform import commands import os.path import pickle import time import variables from interface_graphique.F_ConnexionInscription import * from interface_graphique.F_Principale import * from connexion_serveur import connexion_serveur from analyseur import analyseur from PyQt4 import QtCore def main(): config = dict() variables.systemeExploitation[0] = platform.system() # on regarde sur quel système d'exploitation on est if variables.systemeExploitation[0] == "Linux": # Si on est sous Linux, on vérifie qu'eSpeak est installé if os.path.isfile("config.lv") == False: # On vérifie si c'est la première fois qu'on lance le programme print("Bienvenue sur Lapin-Volant.") config["cecite"] = raw_input("Notre logiciel est accessible aux non-voyants. Êtes-vous non-voyant ? (oui/non) ") if config["cecite"] == "oui" or config["cecite"] == "non": with open('config.lv', 'wb') as fichier: # on stocke l'info donné par l'utilisateur mon_pickler = pickle.Pickler(fichier) mon_pickler.dump(config) else: # si le fichier config.lv existe with open('config.lv', 'rb') as fichier: mon_depickler = pickle.Unpickler(fichier) config = score_recupere = mon_depickler.load() presenceEspeak = commands.getoutput('which espeak') # on vérifie à chaque lancement qu'eSpeak est bien installé if config["cecite"] == "oui": if len(presenceEspeak) == 0: reponseEspeak = raw_input("Lapin-Volant nécessite qu'eSpeak soit installé. Souhaitez-vous installer eSpeak ? (oui/non) ") if reponseEspeak == "oui": commands.getoutput('sudo apt-get install espeak') elif reponseEspeak == "non": print("Notre logiciel ne peut pas fonctionner sans eSpeak. Au revoir.") sys.exit(0) app = QtGui.QApplication(sys.argv) #On se connecte au serveur : connexionAvecServeur = connexion_serveur.connexionServeur() fenetre = F_ConnexionInscription(connexionAvecServeur) fenetre.show() #Timer qui attend des messages du serveur timerRecv = QtCore.QTimer() app.connect(timerRecv, QtCore.SIGNAL("timeout()"), lambda connexion=connexionAvecServeur, fen = fenetre: recvClient(connexion, fenetre)) timerRecv.setInterval(0.2) timerRecv.start() sys.exit(app.exec_()) def recvClient(connexionAvecServeur, fenetre): connexionAvecServeur.setblocking(0) message = connexion_serveur.recevoirMessageServeur(connexionAvecServeur) if len(message) >= 1: print(message) analyseur.analyseur(connexionAvecServeur, message, fenetre)
from interface_graphique.F_ConnexionInscription import *
Je sais que je dois changer de fenêtre quand je reçois "ok_connexion". Mais comment faire en sorte que la prochaine fois qu'on lance l'analyseur, il utilisera une autre version de fenêtre ? Version de fenêtre que je pourrais récupérer en faisant un "nouvelleFenetre = fenetre.changerPage()".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 def analyseur(serveur, message, fenetre): if type(message) == str: message = message.split(" ") if message[0] == "ok_connexion": fenetre.changerPage() elif message[0] == "erreurLogin": fenetre.afficherPopUp(u"Mot de pass et/ou login incorrect.<br />Merci de bien vouloir réessayer") elif message[0] == "erreurCode": fenetre.demanderCode() elif message[0] == "mauvaisCode": fenetre.afficherPopUp(u"Le code que vous avez entré n'est pas le bon.") elif message[0] == "ok_code": fenetre.activerCompte() elif message[0] == "ok_activercompte": fenetre.afficherPopUp(u"Votre compte est activé. Vous pouvez vous connecter.") elif message[0] == "ok_code": fenetre.activerCompte() elif message[0] == "ok_verifierinscription": fenetre.inscription() elif message[0] == "ok_inscription": fenetre.afficherPopUp(u"Inscription effectué.<br />Un mail de confirmation vous a été envoyé sur l'adresse mail indiquée.<br />Merci de bien vouloir rentrer le code indiqué dans le mail lors de votre prochaine connexion.") elif message[0] == "erreurLogin": fenetre.afficherPopUp(u"Le pseudo que vous avez choisi est déjà utilisé.<br />Merci de bien vouloir réessayer") elif message[0] == "erreurMDP": fenetre.afficherPopUp(u"Les mots de pass ne sont pas identique.<br />Merci de bien vouloir réessayer") elif message[0] == "erreurMail": fenetre.afficherPopUp(u"L'adresse mail que vous avez choisi est déjà utilisée.<br />Merci de bien vouloir réessayer") else: if message[0] == "listeConnectes": fenetre.initialiserListeConnectes(message[1])
Avez-vous des suggestions, des idées, des conseils ?
Merci beaucoup.
Partager