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.

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)
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
timerRecv = QtCore.QTimer()
app.connect(timerRecv, QtCore.SIGNAL("timeout()"), lambda connexion=connexionAvecServeur, fen = fenetre: recvClient(connexion, fenetre))
timerRecv.setInterval(0.2)
timerRecv.start()
Exemple : on reçoit "raffraichirConnectes", alors analyseur lancera fenetre.raffraichirConnectes().

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 :

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)
Voici le code de l'analyseur. Ok, c'est pas encore rangé et c'est vraiment pas optimisé !

from interface_graphique.F_ConnexionInscription import *

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])
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()".

Avez-vous des suggestions, des idées, des conseils ?

Merci beaucoup.