Partage
  • Partager sur Facebook
  • Partager sur Twitter

Distribution script Python

module Pygame - recours à Cxfreeze

    22 février 2016 à 17:16:28

    Bonjour,

    J'ai essayé d'utiliser cxfreeze pour distribuer mon script Python mais cela ne fonctionne pas!

    J'arrive à exécuter le fichier mais il plante systématiquement à cet étape de mon script:

    def display_stimuli():
        window = pygame.display.set_mode([0, 0], FULLSCREEN | HWSURFACE | DOUBLEBUF)
        W, H = window.get_size()
    
        #choisir la longueur de la série
        length_parameter = random.choice(serie_length)
    
        #choisir les chiffres qui constitueront la série
        length_chosen = serie_length[:int(length_parameter)]
        stimuli_serie = []
        preview_stimulus = None
        stimuli_unused = [0,1,2,3,4,5,6,7,8,9]
        for l in length_chosen:
                stimulus = random.choice(stimuli_values)
                if stimulus in stimuli_unused:
                    stimuli_unused.remove(stimulus)
                if stimulus not in stimuli_serie:
                    stimuli_serie.extend([stimulus])
                preview_stimulus = stimulus
    
        # présenter les stimuli numériques
        window = pygame.display.set_mode([0, 0], FULLSCREEN | HWSURFACE | DOUBLEBUF)
        W, H = window.get_size()
    
        images = {}
        sizes = {}
        window.fill(background_color)
        for s in stimuli_serie:
    
            for e in pygame.event.get():
                if e.type == KEYDOWN:
                    if e.key == K_ESCAPE:
                        raise Exception
    
            font = pygame.font.Font(None, 400)
            image = font.render(str(s), True, stimulus_color, background_color)
            size = image.get_size()
            window.blit(image, [W/2 - size[0]/2,
                                    H/2 - size[1]/2])
            pygame.display.flip()
            pygame.time.wait(stimulus_duration)
        parameters_stimuli = (length_parameter, stimuli_serie, stimuli_unused)
        return parameters_stimuli

    Le message d'erreur qui s'affiche sur ma console est la suivante: 

    Quelqu'un a déjà ce message d'erreur? Comment le résoudre?

    Merci beaucoup!!!

    Charles

    • Partager sur Facebook
    • Partager sur Twitter
      23 février 2016 à 7:48:38

      Salut

      tu crées une exception, comment la gères-tu ?

      • Partager sur Facebook
      • Partager sur Twitter
        23 février 2016 à 18:04:42

        J'ai créé une exception pour pouvoir quitter l'exécution du script en appuyant simplement sur Echap lorsque je le lançais sur mon ordinateur (où est installé Python).

        Je viens de supprimer cette exception afin de voir si c'était çà qui posait problème... mais ça ne toujours pas pas et j'ai le même message d'erreur qui apparait (cf mon message précédent).

        Voici la totalité de mon script qui te permettra peut-être de m'aider plus facilement:

        #! /usr/bin/env python
        # -*- encoding: utf-8 -*-
        
        """Tâche dérivée du paradigme de Sternberg"""
        
        import pygame
        from pygame.locals import *
        import random
        import sys
        
        #stimuli: chiffres 0 à 9
        #1 essai = 6 séries, au total 24 essais soit 144 séries
        #série: affichage successif d'un nombre aléatoire (compris entre 1 et 6) de chiffres
        #localisation identique pour chacun des chiffres
        #durée d'affichage des chiffres: 1,2sec
        #test: précédé d'un signal d'alarme, affichage 2sec après le dernier stimulus
        #les réponses attendues pour le test doivent entre dans 50% des cas OUI et dans 50% des cas NON
        # tâche n°1 : réponse Oui/Non sur présentation du chiffre
        #feedback: réponse correcte/incorrecte immédiatement après le test
        #fin de l'essai
        
        #définition des constantes
        referent_pathway = 'C:/Users/Claire et Charles/Documents/Informatique_et_statistiques/Python/Scripts/Taches_Treisman_Sternberg/'
        background_color = (255, 255, 255)
        instructions = 'Instructions_Sternberg.png'
        premiere_serie = 'Premiere_serie.png'
        serie_length = [1, 2, 3, 4, 5, 6]
        stimuli_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        stimulus_color = (0,0,0)
        stimulus_duration = 1200
        SOA = 2000
        test_instructions_color = (255,0,0)
        test_stimulus_color = (0,0,0)
        nouvelle_serie = 'Nouvelle_serie.png'
        number_series = 3
        number_trials = 1
        
        
        # choisir les paramètres de la série et présenter les stimuli numériques
        def display_stimuli():
            window = pygame.display.set_mode([0, 0], FULLSCREEN | HWSURFACE | DOUBLEBUF)
            W, H = window.get_size()
        
            #choisir la longueur de la série
            length_parameter = random.choice(serie_length)
        
            #choisir les chiffres qui constitueront la série
            length_chosen = serie_length[:int(length_parameter)]
            stimuli_serie = []
            preview_stimulus = None
            stimuli_unused = [0,1,2,3,4,5,6,7,8,9]
            for l in length_chosen:
                    stimulus = random.choice(stimuli_values)
                    if stimulus in stimuli_unused:
                        stimuli_unused.remove(stimulus)
                    if stimulus not in stimuli_serie:
                        stimuli_serie.extend([stimulus])
                    preview_stimulus = stimulus
        
            # présenter les stimuli numériques
            window = pygame.display.set_mode([0, 0], FULLSCREEN | HWSURFACE | DOUBLEBUF)
            W, H = window.get_size()
        
            images = {}
            sizes = {}
            window.fill(background_color)
            for s in stimuli_serie:
                font = pygame.font.Font(None, 400)
                image = font.render(str(s), True, stimulus_color, background_color)
                size = image.get_size()
                window.blit(image, [W/2 - size[0]/2,
                                        H/2 - size[1]/2])
                pygame.display.flip()
                pygame.time.wait(stimulus_duration)
            parameters_stimuli = (length_parameter, stimuli_serie, stimuli_unused)
            return parameters_stimuli
        
        # afficher la fenêtre avec l'information "TEST"
        def dysplay_warning_signal():
            window = pygame.display.set_mode([0, 0], FULLSCREEN | HWSURFACE | DOUBLEBUF)
            W, H = window.get_size()
            window.fill(background_color)
        
            font = pygame.font.Font(None, 200)
            text_warning_signal = font.render("TEST", 1, (test_instructions_color), (background_color))
            text_warning_signal_size = text_warning_signal.get_size()
            window.blit(text_warning_signal, [W/2 - text_warning_signal_size[0]/2,
                                    H/2 - text_warning_signal_size[1]/2])
            pygame.display.flip()
            pygame.time.wait(2000)
        
        # enregistrer la réponse et le temps de réaction du sujet
        def test_and_response():
            window = pygame.display.set_mode([0, 0], FULLSCREEN | HWSURFACE | DOUBLEBUF)
            W, H = window.get_size()
        
            parameters_stimuli = display_stimuli()
            length_parameter = parameters_stimuli[0]
            stimuli_serie = parameters_stimuli[1]
            stimuli_unused = parameters_stimuli[2]
        
            dysplay_warning_signal()
        
            variable2 = random.choice(series_b)
            if variable2%2 == 0 :
        		stimuli_test = random.choice(stimuli_serie)
            if variable2%2 == 1:
        		stimuli_test = random.choice(stimuli_unused)
            series_b.remove(variable2)
        
            #display stimuli_test and register response (resp, reaction_time)
            pygame.event.get()      # clear any previous events
            reaction_time = None        # target detection response time (or None if no response)
            resp = None
            time0 = pygame.time.get_ticks()
            while resp == None:
                time = pygame.time.get_ticks() - time0
                window.fill(background_color)
        
                #instructions
                font = pygame.font.Font(None, 100)
                text_instructions_test = font.render("Avez-vous vu ce chiffre?", 1, (test_instructions_color), (background_color))
                text_instructions_test_size = text_instructions_test.get_size()
                text_instructions_test_pos = text_instructions_test.get_rect()
                window.blit(text_instructions_test , [W/2 - text_instructions_test_size[0]/2,
                                            H/4 - text_instructions_test_size[1]/2])
        
                #stimulus_test
                font = pygame.font.Font(None, 400)
                stimuli_test_image = font.render(str(stimuli_test), True, stimulus_color, background_color)
                stimuli_test_image_size = stimuli_test_image.get_size()
                window.blit(stimuli_test_image, [W/2 - stimuli_test_image_size[0]/2,
                                        H/2 - stimuli_test_image_size[1]/2])
        
                pygame.display.flip()
        
                #resgister the response
                for e in pygame.event.get():
                    if e.type == KEYDOWN:
                        if e.key == K_LEFT:
                            resp = -1
                            if reaction_time == None:
                                reaction_time = time
                        elif e.key == K_RIGHT:
                            resp = +1
                            if reaction_time == None:
                                reaction_time = time
        
            stimuli_test_resp_rt = (stimuli_test, resp, reaction_time, parameters_stimuli[0], parameters_stimuli[1])
            return stimuli_test_resp_rt
        
        #alerter le sujet qu'une nouvelle série va s'afficher
        def new_serie_signal():
                nouvelle_serie_pathway = str(referent_pathway + nouvelle_serie)
                nouvelle_serie_image = pygame.image.load(str(nouvelle_serie_pathway)).convert()
                window.fill(background_color)
                nouvelle_serie_image_position = nouvelle_serie_image.get_rect()
                window_position = window.get_rect()
                nouvelle_serie_image_position.center = window_position.center
                window.blit(nouvelle_serie_image, nouvelle_serie_image_position)
                pygame.display.flip()
                pygame.time.wait (2000)
        
        # afficher un feedback de la réponse du sujet au test
        # regrouper les différentes données à enregistrer
        def stimuli_test_feedback():
            window = pygame.display.set_mode([0, 0], FULLSCREEN | HWSURFACE | DOUBLEBUF)
            W, H = window.get_size()
        
            stimuli_test_resp_rt = test_and_response()
            stimuli_test = stimuli_test_resp_rt[0]
            stimuli_serie = stimuli_test_resp_rt[4]
        
            window.fill(background_color)
            font = pygame.font.Font(None, 200)
            if stimuli_test in stimuli_serie:
                if stimuli_test_resp_rt[1] == 1:
                    resp_value = 'Bonne'
                    text = font.render("Bravo!", 1, (test_instructions_color), (background_color))
                    textpos = text.get_rect()
                    textpos.center = window.get_rect().center
                    window.blit(text, textpos)
                else:
                    resp_value = 'Fausse'
                    text = font.render("C'est faux!", 1, (test_instructions_color), (background_color))
                    textpos = text.get_rect()
                    textpos.center = window.get_rect().center
                    window.blit(text, textpos)
            else:
                if stimuli_test_resp_rt[1] == 1:
                    resp_value = 'Fausse'
                    text = font.render("C'est faux!", 1, (test_instructions_color), (background_color))
                    textpos = text.get_rect()
                    textpos.center = window.get_rect().center
                    window.blit(text, textpos)
                else:
                    resp_value = 'Bonne'
                    text = font.render("Bravo!", 1, (test_instructions_color), (background_color))
                    textpos = text.get_rect()
                    textpos.center = window.get_rect().center
                    window.blit(text, textpos)
            pygame.display.flip()
            pygame.time.wait(2000)
        
            all_parameters = (stimuli_test_resp_rt[2], resp_value, stimuli_test_resp_rt[3])
            return all_parameters
        
        try:
            last_name_subject = raw_input('Nom : ')
            first_name_subject = raw_input('Prenom : ')
            sex_subject = raw_input('Sexe (h/f): ')
            age_subject = raw_input('Age (ans): ')
            f = open(str(last_name_subject + '_') + first_name_subject + '_Sternberg.txt', 'w')
            print >>f, 'NOM', 'PRENOM', 'SEXE', 'AGE', 'LONGUEUR_SERIE', 'RT (ms)', 'REPONSE'
        
            pygame.init()
        
            window = pygame.display.set_mode([0, 0], FULLSCREEN | HWSURFACE | DOUBLEBUF)
            W, H = window.get_size()
        
            #Print the instruction and wait for space to begin
            start = False
            while not start:
                instructions_pathway = str(referent_pathway + instructions)
                instructions_image = pygame.image.load(str(instructions_pathway)).convert()
                window.fill((0, 0, 0))
                instructions_image_position = instructions_image.get_rect()
                window_position = window.get_rect()
                instructions_image_position.center = window_position.center
                window.blit(instructions_image, instructions_image_position)
                pygame.display.flip()
        
                for e in pygame.event.get():
                    if e.type == KEYDOWN:
                        if e.key == K_SPACE:
                            start = True
        
            #alerter le sujet que la première série va s'afficher
            window.fill(background_color)
            premiere_serie_pathway = str(referent_pathway + premiere_serie)
            premiere_serie_image = pygame.image.load(str(premiere_serie_pathway)).convert()
            premiere_serie_image_position = premiere_serie_image.get_rect()
            window_position = window.get_rect()
            premiere_serie_image_position.center = window_position.center
            window.blit(premiere_serie_image, premiere_serie_image_position)
            pygame.display.flip()
            pygame.time.wait (2000)
        
            #réaliser la tâche en fonction du nombre d'essais et de séries choisis
            for t in range (number_trials):
                series_b = range (number_series)
                series_b.remove(0)
                series_b.extend([number_series])
                for s in range (number_series):
                    all_parameters = stimuli_test_feedback()
        
                    # enregistrer les données dans un fichier
                    print >>f, last_name_subject, first_name_subject, sex_subject, age_subject, all_parameters[2], all_parameters[0], all_parameters[1]
        
                    if t == (number_trials - 1)and s == (number_series - 1):
                        break
                    else:
                        new_serie_signal()
        
        finally:
            f.close()
            pygame.quit()
        

        Merci!

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          23 février 2016 à 18:32:03

          Peut-être pourras-tu régler ton problème avec ce lien. Tiens nous au courant :)
          • Partager sur Facebook
          • Partager sur Twitter
            24 février 2016 à 6:37:08

            Comment sais-tu que c'est display_stimuli() qui fait planter cz_freeze ?

            D'après moi, il semble planter après l'entrée de l'âge :

               f = open(str(last_name_subject + '_') + first_name_subject + '_Sternberg.txt', 'w')
               print >>f, 'NOM', 'PRENOM', 'SEXE', 'AGE', 'LONGUEUR_SERIE', 'RT (ms)', 'REPONSE'
             
               pygame.init()
            


            C'est quoi ce code : print >>f


            • Partager sur Facebook
            • Partager sur Twitter
              24 février 2016 à 16:27:43

              @ Nelimme: Merci pour le lien! Je vais regarder plus précisément ce qui ce dit sur ce forum.

              @ Tsez: l'expression "print >>f" me permet d'enregistrer les données (informations sur le sujet, variables réponses de tâche) dans un fichier .txt

              • Partager sur Facebook
              • Partager sur Twitter

              Distribution script Python

              × 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