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 :

Executer deux fonctions l'une après l'autre [Python 3.X]


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Executer deux fonctions l'une après l'autre
    Bonjour,
    Je crée un petit jeu, un simon pour mon projet de bac d'isn.
    Le jeu est presque fini lorsqu'un problème sauvage apparait, j'ai fait enormement de test et de recherche mais je n'ai pas trouvé la solution et c'est pour cela que je viens vers vous.

    Tout d'abord je suis sur python 3.2 et mon programme s'appuie beaucoup sur une interface tkinter (essentiellement sur des boutons). Ces boutons s'appellent 'Rouge' 'Bleu' 'Jaune' et 'Vert' et sont deja défini dans des fonctions qui marchent (je précise pour dire que le problème ne vient pas d'ici). Leur role est seulement de changer de couleur lorsqu'on appuie dessus.

    Mon soucis est le suivant :
    Une de mes fonctions choisis au hasard un bouton et le fait changer de couleur comme si il s'activait.
    Une autre rejoue les boutons qui on était selectionné au hasard, sachant qu'ils sont enregistrés dans une liste et que cette liste augmente de 1 a chaque tour de jeu
    Le problème étant que mes 2 fonctions marchent, mais en même temps. J'aimerais que d'abord la liste soit rejoué puis qu'un bouton au hasard soit joué. J'ai essayé le time.sleep mais si je le place entre les 2 fonctions alors seul la 2éme est executer... J'ai pensé à un probleme de temps car j'ai time.sleep(1) or les boutons sont activés 1seconde donc ils auraient été activé pendant le time.sleep et donc non visible, mais je ne suis pas sûre.
    J'ai alors essayé de créer un timer (solution alternative pas très très joli) avec une boucle for qui appelle une fonction quand i == 1 puis l'autre quand i == 1000 sauf qu'il attend la fin de la boucle pour activé les boutons même s'il lance la fonction au bon moment........


    Je commence à seché vraiment, je ne sais pas si mon problème est très clair mais en tout cas voici les 2 fonctions en question :
    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
    def Sequence() :
        global sequence,s
        n = len(sequence)
        print(n)
        i = 0
        for i in range (n) :
            print("ici sequence !")
            a = sequence[i]
            if a == 1 :
               Rouge.configure(bg="orange")
               Rouge.after(2000, lambda: Rouge.configure(bg="red"))
     
            elif a == 2 :
                Bleu.configure(bg="blue4")
                Bleu.after(2000, lambda: Bleu.configure(bg="blue"))
                time.sleep(1)
     
            elif a == 3 :
                Jaune.configure(bg="white")
                Jaune.after(2000, lambda: Jaune.configure(bg="yellow"))
     
            elif a == 4:
                Vert.configure(bg="white")
                Vert.after(2000, lambda: Vert.configure(bg="green"))
     
        time.sleep(1)            ##Ne fontionne pas
        return laSequence()  
     
     
     
     
    def laSequence() :
        global sequence,s
        for i in range (1) :
            time.sleep(1)
            print('ici hasard!')
            bouton = ["Rouge","Bleu", "Jaune", "Vert"]
            hasard=choice(bouton)
            t=2000
     
            if hasard=="Rouge" :
                #son1.play()
                Rouge.configure(bg="orange")
                Rouge.after(1000, lambda: Rouge.configure(bg="red"))
                sequence.append(1)
     
            elif hasard=="Bleu" :
                #son2.play()
                Bleu.configure(bg="blue4")
                Bleu.after(1000, lambda: Bleu.configure(bg="blue"))
                sequence.append(2)
     
            elif hasard=="Jaune" :
                #son3.play()
                Jaune.configure(bg="white")
                Jaune.after(1000, lambda: Jaune.configure(bg="yellow"))
                sequence.append(3)
     
            elif hasard=="Vert" :
                #son4.play()
                Vert.configure(bg="white")
                Vert.after(1000, lambda: Vert.configure(bg="green"))
                sequence.append(4)
            t=t+1000
            canvas.after(t, verifSequence)
     
        print(sequence)

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    J'ai pas compris pourquoi tu devais refaire une seconde fois la séquence, c'est un jeu qui joue tout seul ?

    T'as tenté de faire un autre after avec une fonction qui ne fait rien entre tes 2 appels à ces fonctions ?

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    La le code n'est pas complet, la sequence ce rejoue une fois que le joueur a reussi a reproduire la sequence et qu'il appuie sur le bouton suivant, le jeu ne joue pas tout seul ne t'inquiete pas

    Faire un autre after, c'est à dire ?
    Parce que j'ai essayé une fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def Timer() :
       after(1000)
    Mais mettre after juste comme ça, ça marche pas vu qu'il n'est pas défini mais je sais pas trop quoi mettre/comment faire. Donc si tu pouvais préciser un peux ta pensé

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    affter peut s'utiliser sur n'importe quel widget tkinter, tu ne peux pas faire un after comme ça.

    Le problème est qu'il faut jouer avec les after, ça a ses limites, et faut pouvoir jongler avec, mais d'après tes critères, c'est faisable, j'ai fait un rapide test.

    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
    import tkinter as tk
    from random import choice
     
    def colorer(delai, couleur=None) :
        global sequences, fond
     
        boutons = {'red':boutonRouge, 'blue':boutonBleu,
                   'yellow':boutonJaune, 'green':boutonVert}
        if not couleur :
            couleur = choice(tuple(boutons.keys()))
            sequences.append(couleur)
     
        bouton = boutons[couleur]
        bouton.after(delai, bouton.configure, {'bg':couleur})
        bouton.after(delai + 500, bouton.configure, {'bg':fond})
     
    def jouer(n) :
        global delai, sequences
        for n in range(n) :
            colorer(delai)
            delai += 1000
            print(sequences)
     
    def rejouer() :
        global boutonSuivant, sequences, delai
        delai = 0
        boutonSuivant.configure(state=tk.DISABLED)
        for couleur in sequences :
            delai += 1000
            colorer(delai, couleur)
     
     
    fond = 'grey'
    sequences = []
     
    root = tk.Tk()
     
    boutonRouge = tk.Button(root, width=30, bg=fond)
    boutonRouge.grid(row=1, column=1)
     
    boutonBleu = tk.Button(root, width=30, bg=fond)
    boutonBleu.grid(row=1, column=2)
     
    boutonVert = tk.Button(root, width=30, bg=fond)
    boutonVert.grid(row=2, column=1)
     
    boutonJaune = tk.Button(root, width=30, bg=fond)
    boutonJaune.grid(row=2, column=2)
     
    boutonSuivant = tk.Button(root, text='rejouer', width=30, bg=fond,
                              command=rejouer, state=tk.DISABLED)
    boutonSuivant.grid(row=3, column=1, columnspan=2)
     
    delai = 0
     
    jouer(5)
     
    boutonSuivant.after(delai, boutonSuivant.configure, {'state':tk.NORMAL})
     
    root.mainloop()
    A toi d'adapter à ton code.

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Le code que tu montres la permet juste de faire rejouer la meme sequence en appuyant sur rejouer, mais il ne rajoute pas le bouton supplémentaire, qui est mon soucis : une fonction sur les deux est rejoué (ou dans mon cas son jouer en même temps)

  6. #6
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Bah je comprends pas ce que tu veux faire

    Le but est de faire comme le jeu que tu mentionnes non ?
    Donc jouer une séquence de couleurs que l'utilisateur doit répéter.
    Et s'il réussi, augmenter chaque fois la séquence de couleurs.

    Donc, je vois pas où ton problème se situe.

  7. #7
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Comme je te disais, il suffit d'adapter.

    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
    import tkinter as tk
    from random import choice
     
    def colorer(delai, couleur=None) :
        global sequence
        if not couleur :
            couleur = choice(tuple(boutons.keys()))
            sequence.append(couleur)
        bouton = boutons[couleur]
        bg, disfg = bouton['bg'], bouton['disabledforeground']
        bouton.after(delai, bouton.configure,
                     {'bg': bouton['activebackground'],
                      'disabledforeground': bouton['activeforeground']
                     })
        bouton.after(delai + delaiColoriage, bouton.configure,
                     {'bg': bg,
                      'disabledforeground': disfg
                      })
     
    def jouerSequence(nombreSequence, delai) :
        for n in range(nombreSequence) :
            colorer(delai)
            delai += delaiSequence
        return delai
     
    def jouer() :
        delai = 0
        boutonJouer.configure(state=tk.DISABLED)
        global sequence, nombreSequence
        if not sequence :
            delai = jouerSequence(nombreSequence, delai)
            print(sequence)
        else :        
            boutonJouer.configure(state=tk.DISABLED)
            for couleur in sequence :
                delai += delaiSequence
                colorer(delai, couleur)
            delai += delaiSequence
            delai = jouerSequence(1, delai)
            print(sequence)
            nombreSequence += 1
        boutonJouer.after(delai, boutonJouer.configure, {'state':tk.NORMAL})  
     
    sequence = []
    nombreSequence = 3
    delaiSequence = 1000
    delaiColoriage = 500
     
    optionsBoutonCouleur = dict(width=30, bg='grey', highlightthickness=1, bd=3,
                                height=3, disabledforeground='lightGrey',
                                activeforeground='black', state=tk.DISABLED)
     
    root = tk.Tk()
     
    boutonRouge = tk.Button(root, optionsBoutonCouleur, text='ROUGE', fg='red',
                                                        activebackground='red')
    boutonRouge.grid(row=1, column=1)
     
    boutonBleu = tk.Button(root, optionsBoutonCouleur, text='BLEU', fg='blue',
                                                        activebackground='blue')
    boutonBleu.grid(row=1, column=2)
     
    boutonVert = tk.Button(root, optionsBoutonCouleur, text='VERT', fg='green',
                                                        activebackground='green')
    boutonVert.grid(row=2, column=1)
     
    boutonJaune = tk.Button(root, optionsBoutonCouleur, text='JAUNE', fg='yellow',
                                                        activebackground='yellow')
    boutonJaune.grid(row=2, column=2)
     
    boutons = {'red':boutonRouge, 'blue':boutonBleu,
               'yellow':boutonJaune, 'green':boutonVert}
     
    boutonJouer = tk.Button(root, text='Jouer sequence', width=30, bg='grey',
                            command=jouer, state=tk.NORMAL)
    boutonJouer.grid(row=3, column=1, columnspan=2)
     
    root.mainloop()
    La la séquence est jouée une première fois, puis rejouée en ajoutant une couleur chaque fois.

    Si c'est pas ce que tu veux, j'abandonne.
    Au moins j'aurais une base si je veux faire un jour ce jeu

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Oui pardon quand j'avais testé ce que tu me montrais je me suis mentalement égarée mais c'était bien ça !
    Donc en adaptant j'ai reussi à me débloquer, merci beaucoup pour ton aide ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lancement de fonction les unes après les autres
    Par fflo4ever dans le forum ActionScript 3
    Réponses: 4
    Dernier message: 19/03/2010, 10h32
  2. Afficher deux courbes les unes après les autres
    Par gmachi10 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 09/07/2008, 09h49
  3. appeler deux fonctions dans une autre
    Par ririrourou dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 05/06/2008, 15h11
  4. [GtkAda]lancer deux feneres l'une aprés l'autres
    Par scriptoff dans le forum GTK+
    Réponses: 0
    Dernier message: 01/06/2008, 12h15
  5. Réponses: 7
    Dernier message: 06/07/2006, 22h33

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