Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Pygame] Le code minimal

Sujet résolu
    26 juillet 2010 à 10:31:48

    Bonjour tout le monde, :)

    En attendant le tutoriel de Nohar sur Pygame et la suite de ceux de Suzy et le tutoriel officiel, j'ai décider de m'avancer un peu. Je suis aller voir du côté de pygame.org pour chercher un tutoriel pas trop difficil à apprendre en anglais.

    Après quelques minutes, j'ai pris celui de 'DrOid' mais voilà que j'ai déjà un problème:
    J'essaye d'ouvrir une petite fenêtre et de la quitter avec une event tu type 'QUIT'; mais lorsque je ferme la fenêtre grâce à la petite croix (donc de l'event 'QUIT') j'obtiens ceci:
    "Le programme à cessé de fonctionner, patati patata..."

    Ma question: Comment éviter ce problème ?

    Je vous post mon code:

    import pygame
    
    pygame.init()
    pygame.display.set_caption("Essai")
    
    #Crée la surface de l'écran
    screen = pygame.display.set_mode((240, 180))
    
    continuer = True
    
    while(continuer):
        #Regarde s'il y a une event
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                #On quitte la fenêtre
                continuer = False
    



    P.S: Je suis sous Windows vista (32 bit) avec Python 3.1.

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      26 juillet 2010 à 10:46:52

      As-tu moyen d'exécuter ça dans une console pour qu'on ait un traceback si jamais c'est une exception python qui est levée ?

      Ton code est tout à fait correct (il manque juste le petit commentaire définissant l'encodage pour que Python évite de faire la tronche en lisant le 'é' de 'écran' ligne 6), il tourne sans problème chez moi (sous Linux).

      En revanche, je te suggère de rester à Python 2.x pour utiliser Pygame, si tu veux que ton code puisse tourner sur toutes les plateformes... (pour info, le tuto est rédigé avec Python 2.6)

      EDIT:

      Sinon, essaye de remplacer ton "while continuer" par "while True" et le "continuer = False" par un "sys.exit(0)" (ce qui demande d'importer le module sys).
      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        26 juillet 2010 à 10:52:57

        Chez moi ton code fonctionne très bien. J'utilise Pygame, et je ne vois aucune erreur dans ton code. En plus, j'ai exactement la même configuration que toi ! :p

        J'ai quand même une petite remarque à faire, mais il se peut que tu ne sois pas concerné : comme tu utilises des accents dans les commentaires, j'ai eu besoin de spécifier l'encodage (de mon côté c'est iso-8859-1). Mais après les avoir supprimé, j'ai à nouveau testé le code et il fonctionne à merveille.

        Après une petite recherche, je crois avoir trouvé d'où vient le problème. Après la ligne où tu importes Pygame, ajoute celle-là :
        from pygame.locals import *
        


        • Partager sur Facebook
        • Partager sur Twitter
          26 juillet 2010 à 10:55:34

          Tout dabord merci de ta réponse,

          Lorsque je lance mon code à partir de la console voici ce que j'obtiens:

          Ligne 1: syntaxError, Invalid syntax
          import pygame*


          J'aimerais rester sous Python 3 (Pourquoi retourner sur la 2.6 ? Autant profiter des nouvelles versions)

          Citation

          (pour info, le tuto est rédigé avec Python 2.6)



          => Oh non... c'est vrément domage ça :'(
          Il y a t'il beaucoup de diférences entre Python 2.X et 3.X avec Pygame ?


          EDIT: J'ai essayé ce que tu m'as dit Rastagong:

          import pygame
          from pygame.locals import *
          #La suite de mon code
          


          Mais ça me fait toujours le même erreur
          • Partager sur Facebook
          • Partager sur Twitter
            26 juillet 2010 à 10:58:24

            Il me semble que Pygame n'est pas totalement compatible avec Python 3 :

            Citation : Le site officiel de Pygame

            Does Pygame work with Python 3?

            Release 1.9.0 does. Pygame from SVN builds as is with Python 3.0 and later. But Python 3 support is incomplete and still in the development stage. Not all modules have been ported. No scrap, for instance. And Numeric support will never happen, though NumPy support should be available when NumPy is itself ported. The Pygame successor, pgreloaded (Pygame Reloaded) also supports Python 3.

            • Partager sur Facebook
            • Partager sur Twitter
              26 juillet 2010 à 11:00:18

              Citation : realmagma

              Tout dabord merci de ta réponse,

              Lorsque je lance mon code à partir de la console voici ce que j'obtiens:

              Ligne 1: syntaxError, Invalid syntax
              import pygame*




              normal, tu as écrit pygame* au lieu de pygame.


              Citation : realmagma


              J'aimerais rester sous Python 3 (Pourquoi retourner sur la 2.6 ? Autant profiter des nouvelles versions)

              Citation

              (pour info, le tuto est rédigé avec Python 2.6)



              => Oh non... c'est vrément domage ça :'(
              Il y a t'il beaucoup de diférences entre Python 2.X et 3.X avec Pygame ?



              Python 3 est le prochain standard, certes, mais il n'est pas encore mature (sinon ils n'auraient pas sorti la 2.7 il y a deux semaines alors que la 3.1 est là depuis de nombreux mois...) et "pret à conquérir le monde" parce que de trop nombreux projets tournent avec python 2 (natif sur beaucoup d'OS).
              Tu peux rester sous Python3 si tu le souhaites, cela ne fera aucune différence dans l'utilisation de pygame (edit : en fait si, je n'avais pas lu le message de rastagong) mais sur les autres plateformes que Windows (Mac, Linux, BSD...), Pygame, tout comme la plupart des bibliothèques Python sur ces plateformes, n'est pas livrée pour Python3. Ton code ne sera donc pas portable.
              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoir, le site qui en a dans le citron !
                26 juillet 2010 à 11:08:11

                Citation : NoHaR

                Citation : realmagma

                Tout dabord merci de ta réponse,

                Lorsque je lance mon code à partir de la console voici ce que j'obtiens:

                Ligne 1: syntaxError, Invalid syntax
                import pygame*




                normal, tu as écrit pygame* au lieu de pygame.



                Absolument pas. J'ai écrit:

                import pygame
                


                => L'erreur apparaît toujours

                et ensuite:

                import pygame
                from pygame.locals import *
                


                => De même.


                EDIT: J'ai oublié de préciser que j'ai télécharger ce module:

                pygame-1.9.1.win32-py3.1.msi 3MB

                Il y avait 3.1 dedans pour windows 32 bit.
                • Partager sur Facebook
                • Partager sur Twitter
                  26 juillet 2010 à 11:24:14

                  Je viens de me rendre compte qu'il est normal que ce que je t'ai dit de faire ne fonctionne pas... Je n'avais pas vu que tu avais écrit pygame.QUIT et non QUIT (et donc que tu avais bien spécifié de quel module venait cette valeur).

                  Il n'empêche que c'est vraiment étrange, surtout l'erreur de syntaxe... En tout cas, ça ne vient pas de la version de Pygame, j'ai téléchargé le même fichier que toi.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 juillet 2010 à 11:37:28

                    Heu... comment dire... !

                    Tapez pas !!! :p

                    J'avais un fichier essaiPygam.py et un fichier essaiPygame.py. Je me suis juste trompé de fichier.

                    Je suis vrément désolé, j'aurais dû mieux regarder les fichiers que j'avais.

                    Je nz comprends pas pourquoi dans mon répertoire Python c'est le foutoire alors que celui du langage C c'est tout bien rangé :p .

                    1 000 excuses et je le répète encore, désolé.

                    EDIT: En faite, si je ne lance pas mon programme depuis la console ça ne marche pas.

                    Si dans mon shell je fait Ctrl + N puis je copie/colle mon code puis F5 ça va buger.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 juillet 2010 à 12:00:04

                      Citation


                      Sinon, essaye de remplacer ton "while continuer" par "while True" et le "continuer = False" par un "sys.exit(0)" (ce qui demande d'importer le module sys).



                      C'est peut être une mauvaise habitude du C++, mais n'est il pas mieux de simplement casser la boucle dans ce cas plutot que de fermer le programme.
                      Si on souhaite faire des procédures à la fermeture du programme par exemple (ou libérer de la mémoire en C++ :-° )
                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 juillet 2010 à 12:02:04

                        Citation : EPonix

                        Citation


                        Sinon, essaye de remplacer ton "while continuer" par "while True" et le "continuer = False" par un "sys.exit(0)" (ce qui demande d'importer le module sys).



                        C'est peut être une mauvaise habitude du C++, mais n'est il pas mieux de simplement casser la boucle dans ce cas plutot que de fermer le programme.
                        Si on souhaite faire des procédures à la fermeture du programme par exemple (ou libérer de la mémoire en C++ :-° )



                        Je voulais simplement vérifier que l'erreur ne se produisait pas lors de la dés-initialisation de pygame ce qui impliquait de quitter l'exécution différemment. Sinon, en effet, simplement quitter la boucle de cette manière ne pose aucun problème.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Zeste de Savoir, le site qui en a dans le citron !
                          26 juillet 2010 à 12:02:51

                          En faite je viens de m'apercevoir d'une chose.

                          Si je lance mon code depuis ma console: \Documents\monFichier\essaiPagame.py
                          La fanêtre marchera.

                          Mais si je fais comme suit:

                          - Ouvrir le Shell
                          - Ctrl+N (ouvre un espèce de blocNote intelligent
                          - F5 pour interpréter

                          => Bug de la fenêtre
                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 juillet 2010 à 12:04:49

                            Citation : realmagma

                            En faite je viens de m'apercevoir d'une chose.

                            Si je lance mon code depuis ma console: \Documents\monFichier\essaiPagame.py
                            La fanêtre marchera.

                            Mais si je fais comme suit:

                            - Ouvrir le Shell
                            - Ctrl+N (ouvre un espèce de blocNote intelligent
                            - F5 pour interpréter

                            => Bug de la fenêtre



                            Oui, c'est un "défaut" de pygame sous Windows.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Zeste de Savoir, le site qui en a dans le citron !
                              26 juillet 2010 à 12:08:59

                              Il y a defois ou je regrette de ne pas être sous Linux ou mac (ou autre ;) )

                              J'en profite pour te demander ou en est le tutoriel ? :p
                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 juillet 2010 à 12:12:38

                                Ça avance, doucement, mais ça avance.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Zeste de Savoir, le site qui en a dans le citron !
                                  26 juillet 2010 à 12:49:01

                                  Re-bonjour,

                                  pour éviter de créer un autre topic, je vais poster mon problème ici.

                                  J'aimerais charger une image avec pygame.
                                  Le problème c'est qu'il ne trouve pas mon image.
                                  Droid nous dit d'utiliser path.join. Je suis allé sur la doc pour voir comment sa fonctionne, mais ça ne marche pas.

                                  pygame.init()
                                  
                                  os.path.join("c:", "Documents\Langages\Python\fichier")
                                  image = pygame.image.load("balle.PNG")
                                  pygame.display.set_caption("Essai")
                                  


                                  Suis-je complètement à côté de la plaque ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    26 juillet 2010 à 13:07:09

                                    C'est le \f qui pose problème : tu devrais doubler les antislashes.

                                    >>> print "a\fa\fa\fa\fa"
                                    a
                                     a
                                      a
                                       a
                                        a
                                    
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Zeste de Savoir, le site qui en a dans le citron !
                                      26 juillet 2010 à 14:10:30

                                      J'ai fais ce que tu m'as dit, mais sans succès :D .

                                      ligne 33:
                                      image = pygame.load("balle.png")
                                      couldn't open balle.png


                                      Pourtant ma balle est bien en png, le nom est correct et bien dans le même dossier (fichier) que mon fichier justement :p
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        26 juillet 2010 à 14:14:51

                                        Si ton image est dans le même dossier que ton fichier, plus besoin de os.path.join : indique juste le nom du fichier.
                                        image = pygame.image.load("balle.png")
                                        


                                        Au fait, dans dans ton message précédent, l'erreur parle de pygame.load, pas de pygame.image.load. Vérifie que tu as indiqué le nom complet de la fonction. ;)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          26 juillet 2010 à 14:27:51

                                          Mon fichier.py est situé ici:

                                          C:\Users\utilisateur\Documents\Logiciels\Python\fichier\essaiPygame.py

                                          Dans le sous répertoire 'fichier' jai:

                                          balle.png
                                          essaiPygame.py

                                          exercice.py
                                          projet.py

                                          Que je mette os.path.join ou que je l'omet (donc en indiquant le nom du fichier), l'erreur est la même.
                                          Could'nt open balle.PNG

                                          Je vais m'arracher les cheveux :lol:

                                          Citation

                                          Au fait, dans dans ton message précédent, l'erreur parle de pygame.load, pas de pygame.image.load. Vérifie que tu as indiqué le nom complet de la fonction



                                          En effet, j'avais un 'attributError'. Car parceque ma variable s'appellait 'image'.

                                          Maintenant j'ai un pygame.error, couldn't open...
                                          J'ai juste recopier ce que disait le tuto, ça devrait marcher (ou bien je vois très mal, et c'est bien possible ;) )

                                          import pygame, os
                                          
                                          
                                          ################################
                                          ## Les diférrentes variables: ##
                                          #
                                          continuer = True
                                          
                                          ################################
                                          ## Programme Principale:      ##
                                          #
                                          pygame.init()
                                          
                                          os.path.join("C:", "Documents\\Logiciels\\Python\\fichier")
                                          monImage = pygame.image.load("balle.PNG")
                                          pygame.display.set_caption("Essai")
                                          
                                          #Cree la surface de l'écran
                                          screen = pygame.display.set_mode((240, 180))
                                          
                                          screen.blit(monImage, (50, 50))
                                          
                                          while(continuer):
                                              #Regarde s'il y a une event
                                              for event in pygame.event.get():
                                                  if event.type == pygame.QUIT:
                                                      #On quitte la fenetre
                                                      continuer = False
                                          
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            26 juillet 2010 à 15:05:29

                                            Voilà mon avis, mais je suis débutant en Python, donc surtout, prends donc tout ce que je dis avec des pincettes ! :p

                                            Je crois que tu n'as pas compris l'utilité de la fonction os.path.join. Cette fonction retourne un chemin construit à partir de morceaux de chemin. Par exemple, si tu lui transmets d'une part le chemin vers un dossier, et d'autre part le nom d'un fichier situé dans ce dossier, elle concatènera le chemin et le nom de fichier en ajoutant un slash entre les deux. Exemple :
                                            chemin = os.path.join("C://Users//Utilisateur","Truc.png")
                                            print(chemin)
                                            #Retourne « C://Users//Utilisateur/Truc.png »
                                            


                                            Or, dans ton exemple, tu ne récupères pas le chemin concaténé, ce qui fait que la ligne que tu as écrite ne sert strictement à rien.

                                            Voici le code que je te propose :
                                            # -*-coding:iso-8859-1 -
                                            import pygame, os
                                            from pygame.locals import *
                                            
                                            #Initialisation
                                            pygame.init()
                                            fenetre = pygame.display.set_mode((500, 180))
                                            fenetre.fill((255,255,255)) #Je colorie la fenêtre en blanc, c'est plus joli
                                            pygame.display.set_caption("Essai")
                                            
                                            #Chargement de l'image
                                            chemin = os.path.join("C://Users//utilisateur//Documents//Logiciels//Python//fichier","balle.PNG") 
                                            image = pygame.image.load(chemin) 
                                            
                                            #Affichage
                                            screen.blit(image, (0, 0))
                                            pygame.display.flip()
                                            
                                            #Boucle des évènements
                                            continuer = True
                                            while continuer:
                                            	evenement = pygame.event.poll()
                                            	if evenement.type == QUIT:
                                            		continuer = False
                                            


                                            Essaie-le, mais je ne pense pas que cela règlera le problème en lui-même. Le seul endroit d'où ça peut maintenant provenir, c'est du nom de fichier : t'as pensé à regarder si l'extension (.png) est écrite en majuscules ou en minuscules ?

                                            N'oublie pas, je ne suis qu'un débutant, donc il se peut que ce que je t'ai dit soit complètement faux. ;)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              26 juillet 2010 à 15:15:23

                                              Effectivement ça marche. :)
                                              Merci aux personnes qui ont posté :)

                                              Je mets le topic en résolu.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                26 juillet 2010 à 15:22:59

                                                Pour utiliser convenablement os.path.join, il est possible de la coupler avec la fonction reduce .

                                                >>> reduce(os.path.join, ['/home', 'nohar', 'prog', 'python', 'exemple', 'monfichier.py'])
                                                '/home/nohar/prog/python/exemple/monfichier.py'
                                                
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Zeste de Savoir, le site qui en a dans le citron !
                                                Anonyme
                                                  26 juillet 2010 à 17:07:44

                                                  Bonjour,

                                                  Pour ton problème de fenêtres qui ne se ferme pas, ajoute ceci à la fin de ton script : pygame.quit().

                                                  @+
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    27 juillet 2010 à 12:06:54

                                                    Citation : NoHaR

                                                    Pour utiliser convenablement os.path.join, il est possible de la coupler avec la fonction reduce .

                                                    >>> reduce(os.path.join, ['/home', 'nohar', 'prog', 'python', 'exemple', 'monfichier.py'])
                                                    '/home/nohar/prog/python/exemple/monfichier.py'
                                                    
                                                    J'en avais seulement entendu parler, de reduce : comme je programme en Python 3, je dois faire un import functools pour pouvoir l'utiliser, donc elle est un peu plus cachée.
                                                    Mais son utilisation a l'air intéressante, je vais tâcher de l'utiliser.

                                                    Merci. :)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    [Pygame] Le code minimal

                                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                    • Editeur
                                                    • Markdown