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

Python Discussion :

time.sleep bloque le programme


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut time.sleep bloque le programme
    Bonjour à tous,

    Je suis actuellement entrain de créer un jeu vidéo en python avec la bibliothèque graphique pygame.

    J'ai mis en place quelques "animations" qui vont du simple affichage de texte avec des intervalles de temps au déplacement de personnages automatiquement sur la carte.

    Pour ce faire j'ai donc besoin de figer le programme plus au moins longtemps entre chaques action (entre chaque pas d'un PNG, j'ai mis un time.sleep de 0,2 secondes)

    Voilà un exemple d'une animation très simple d'affichage de texte en décalé :

    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
     
    self.fond = pygame.image.load('img/map/noir.png')
     
     
    self.texte1 = self.font.render("Vous voilà revenu dans le village de votre enfance.",1,(206,206,206))
    self.texte2 = self.font.render("Mais quelque chose est différent...",1,(206,206,206))
    self.texte3 = self.font.render("Il y a une odeur âcre dans l'air, une odeur de soufre.",1,(206,206,206))
    self.texte4 = self.font.render("La peur se lit dans les yeux des habitants, d'habitude serain.",1,(206,206,206))
     
     
     
     
    fen1.blit(self.fond, (0,0))
    pygame.draw.rect(fen1,(3,34,76),(0,568,1024,200))
    fen1.blit(self.texte1,(10,580))
    pygame.display.flip()
    time.sleep(2)
    fen1.blit(self.texte2,(10,610))
    pygame.display.flip()
    time.sleep(2)
    fen1.blit(self.texte3,(10,640))
    pygame.display.flip()
    time.sleep(2)
    fen1.blit(self.texte4,(10,670))
    pygame.display.flip()
    En revanche je rencontre un problème, si je clic sur la fenêtre ou que je la déplace et parfois même sans avoir rien touché pendant cette animation, le programme se fige complètement jusqu'à ce que l'animation se termine.

    Par exemple si je clic au moment de l'affichage du texte 1, seul ce texte sera affiché et le programme restera figé pendant les 6 secondes restantes avant la fin de l'animation:

    voilà une capture d'écran de ce que ça fait :

    Nom : lag.png
Affichages : 915
Taille : 40,5 Ko

    Le programme "ne repond plus" et l'écran se fige jusqu'à la fin de l'animation.

    j'ai essayé de remplacer les time.sleep() par des pygame.time.delay() mais ça ne change rien, avez vous une solution ?

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    Salut,

    je connais pas pygame, mais vu la description du problème, je me dis qu'il te sera utile de te renseigner sur les threads.

    pour en dire un peu plus sur ce que je pense être le problème, je dirais que si tu bouge ou que tu redimensionne ta fenêtre, ton programme a besoin de redessiner à l'écran tout ce qui est contenu dans ta fenêtre.
    le problème est que les sleep de ton animation "accapare le flot d'exécution du programme" et le raffraichissement du contenu de la fenêtre ne peut pas intervenir tant que ton animation n'est pas terminée.
    l'idéal serait que le rafraîchissement de l'interface graphique et le code qui déroule l'animation puissent s'exécuter en parallèle... et c'est justement ce à quoi servent les threads: exécuter plusieurs traitement en parallèle, plus ou moins indépendamment.

    je peux pas t'en dire plus car ce n'est pas quelque chose que j'utilise souvent, mais je pense qu'il faut chercher par là.
    par contre attention: bosser avec des threads nécessite de la rigueur. y a moyen de provoquer des bugs bien difficiles à régler avec ces bêtes là...

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour ta réponse,
    je vais me renseigner sur les thread et voir comment je peux les intégrer dans mon programme, je posterais le résultat ici

    mais connais tu un bon tutoriel sur l'utilisation des thread ?

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    j'ai pas de tuto particulier à te conseiller mais je à peu près certain que tu trouveras ton bonheur avec 2 ou 3 recherches google bien senties

    et sinon, si t'es à l'aise aevc Python (j'ose limaginer puisque que as commencé à développer un jeu), tu peux commencer par la page de recherche de la doc python

  5. #5
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Bonjour,

    As-tu essayé d'utiliser, pygame.time.delay() ou pygame.time.wait() à la place de sleep ?
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    oui j'ai déjà essayé et ça n'a rien changé.

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    je n'arrive pas à comprendre comment utiliser les thread dans mon code que voici :
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
     
    import pygame,time
    from module.menu_action import *
    from module.quete import *
    import threading
     
     
    """Cette class gère l'histoire générale du jeu, elle affiche la cinématique de début et sauvegarde
    l'atat de chacunes de suqêtes ainsi que les objectifs en cours"""
     
     
     
    class quete:
        def __init__(self):
            self.cinematique = True
     
     
        def Affichage_cine(self,fen1,personnage,carte,item,comp):
     
     
            self.font = pygame.font.SysFont(None, 32)
            pygame.display.set_caption("Cinématique")
            self.fond = pygame.image.load('img/map/noir.png')
     
            self.texte1 = self.font.render("Vous voilà revenu dans le village de votre enfance.",1,(206,206,206))
            self.texte2 = self.font.render("Mais quelque chose est différent...",1,(206,206,206))
            self.texte3 = self.font.render("Il y a une odeur âcre dans l'air, une odeur de soufre.",1,(206,206,206))
            self.texte4 = self.font.render("La peur se lit dans les yeux des habitants, d'habitude serain.",1,(206,206,206))
     
            self.affichage_texte_cine(fen1)
            if personnage.classe == "paladin":
                self.texte1 = self.font.render("L'entrainement au combat que vos parents vous ont fait subir vous sera sûrement très utile...",1,(206,206,206))
                self.texte2 = self.font.render(personnage.pseudo + ", faites votre possible pour aider les habitants de cette région !",1,(206,206,206))
                self.texte3 = self.font.render("Mais attention car elle est dangereuse en ces temps troublés.",1,(206,206,206))
                self.texte4 = self.font.render("Les soldats impériaux sont au front : vous n'aurez aucun soutient, aucune aide....",1,(206,206,206))
     
            elif personnage.classe == "mage":
                self.texte1 = self.font.render("Vous ressentez une aura magique très puissante dans ces lieux.",1,(206,206,206))
                self.texte2 = self.font.render(personnage.pseudo + ", trouvez et comprenez ce qu'il se passe ici !",1,(206,206,206))
                self.texte3 = self.font.render("Mais attention la région est dangereuse en ces temps troublés.",1,(206,206,206))
                self.texte4 = self.font.render("Vos frères et soeurs sont tombés aux mains de l'Eglise, vous êtes seul !",1,(206,206,206))
     
            elif personnage.classe == "voleur":
                self.texte1 = self.font.render("Vous remarquez tout de suite que quelque chose ne va pas !",1,(206,206,206))
                self.texte2 = self.font.render(personnage.pseudo + ", c'est à vous de rechercher la cause de ces perturbations.",1,(206,206,206))
                self.texte3 = self.font.render("Affûtez vos lames et n'oubliez jamais que vous ne pouvez vous fier qu'à elles...",1,(206,206,206))
                self.texte4 = self.font.render("La confrérie ne vous viendra pas en aide, vous combatterez seul avec vos lames !",1,(206,206,206))
     
     
            time.sleep(4)
            self.affichage_texte_cine(fen1)
            time.sleep(4)
     
     
     
            carte.affichage(fen1,personnage,item,comp)
            self.fond.set_alpha(255)
            fen1.blit(self.fond, (0,0))
            carte.contour(fen1,personnage)
            pygame.display.flip()
            self.fond_alpha = self.fond.get_alpha()
            while self.fond_alpha > 0:
                carte.affichage(fen1,personnage,item,comp)
                self.fond.set_alpha(self.fond_alpha - 15)
                fen1.blit(self.fond, (0,0))
                self.fond_alpha = self.fond.get_alpha()
                carte.contour(fen1,personnage)
                pygame.display.flip()
                time.sleep(0.1)
     
     
        def affichage_texte_cine(self,fen1):
            #cette fonction affiches progressivement les textes pendants la cinématique
            pygame.display.set_caption("Cinématique")
            fen1.blit(self.fond, (0,0))
            pygame.draw.rect(fen1,(3,34,76),(0,568,1024,200))
            fen1.blit(self.texte1,(10,580))
            pygame.display.flip()
            time.sleep(2)
            fen1.blit(self.texte2,(10,610))
            pygame.display.flip()
            time.sleep(2)
            fen1.blit(self.texte3,(10,640))
            pygame.display.flip()
            time.sleep(2)
            fen1.blit(self.texte4,(10,670))
            pygame.display.flip()
    je ne sais pas ce que mes thread sont censés faire puisque la seule animation que j'ai c'est affichage_texte_cine(self,fen1)
    dois-je utiliser un seul thread ? ou au minimum 2 ?

Discussions similaires

  1. Lancer un programme sans qu'il bloque le programme actuel
    Par _-Slash-_ dans le forum Windows
    Réponses: 2
    Dernier message: 14/11/2010, 08h26
  2. probleme de recv qui bloque mon programme
    Par ing2009 dans le forum Réseau
    Réponses: 0
    Dernier message: 06/05/2009, 16h23
  3. Sleep bloque tout.
    Par Golgotha dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 24/09/2008, 16h15
  4. Erreur qui bloque mon programme
    Par bugland dans le forum Langage
    Réponses: 6
    Dernier message: 21/12/2006, 22h32
  5. time.sleep() ne fonctionne pas comme souhaité
    Par Olivier_ dans le forum Général Python
    Réponses: 3
    Dernier message: 19/11/2005, 01h46

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