IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Changer les arguments initiaux d'un QTimer


Sujet :

PyQt Python

Vue hybride

Ephysio Changer les arguments... 04/02/2013, 22h55
wiztricks Salut, Absolument!... 07/02/2013, 12h02
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut Changer les arguments initiaux d'un QTimer
    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.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 716
    Par défaut
    Salut,

    L'idéal serait de pouvoir dire au programme "arrête de lancer recvClient avec cette variable fenêtre, utilise plutôt celle-ci !".
    Absolument!
    Pourquoi vouloir hacker le lambda plutôt que de réfléchir à un design qui réalise ce genre d'exigence?
    Un truc simple pourrait être d'ajouter une indirection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def analyseur(serveur, message, window):
        fenetre = window.actuelle()
        if type(message) == str:
            message = message.split(" ")
     
            if message[0] == "ok_connexion":
                window.changerPage()
                fenetre = window.actuelle()
            ...
    Charge à la méthode '.actuelle' de gérer la fenêtre "courante" et de la mettre à jour après l'appel à '.changerPage'
    Mais c'est de la bidouille: l'intérêt de Python c'est de pouvoir jeter tout ou partie du design lorsqu'il ne permet plus d'intégrer des exigences "basiques".
    On peut bien sur "rafistoler" pour que çà avance mais c'est limite.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. peut on changer les arguments VM?
    Par L4BiN dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 15/06/2007, 12h21
  2. [Forms] changer les couleurs
    Par Nounoursonne dans le forum Forms
    Réponses: 11
    Dernier message: 02/04/2004, 09h40
  3. Réponses: 4
    Dernier message: 09/02/2004, 16h19
  4. changer les caracteres decouleurs
    Par jeclake dans le forum C
    Réponses: 5
    Dernier message: 16/04/2003, 17h31
  5. Changer les couleurs de la palette avec du RGB
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 11
    Dernier message: 13/01/2003, 08h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo