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

Tkinter Python Discussion :

Bouton rejouer tkinter python


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Femme Profil pro
    étudiante
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : étudiante
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Bouton rejouer tkinter python
    Bonjour j'aimerais savoir s'il est possible sur Python de créer un bouton rejouer afin de recommencer le jeu depuis le début ? (sachant que mon programme est sous tkinter) merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Of course it is!
    Next question?

    - W

  3. #3
    Candidat au Club
    Femme Profil pro
    étudiante
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : étudiante
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Of course it is!
    Next question?

    - W
    Comment il fait faire s'il te plait ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Bah... En fait, c'est très simple. Par contre c'est pas fastoche à raconter. En fait, "raconter" çà se fait avec des mots techniques. Les mots techniques recouvrent des concepts que demanderaient à être définis, histoire d'être compris.
    Mais bon si "chaise", "table", ... sont des concepts partagés: cycle de vie d'une application, d'un objet, appel de fonction callback, ... vous échappent encore, sinon vous ne poseriez pas ce genre de question.

    A défaut de partager un vocabulaire, on peut l'illustrer avec du code.
    Pour faire simple, il faut déjà commencer par écrire un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tk.Button(..., text='replay', command=do_replay)
    Et voilà! on a le bouton.
    Pas facile de planter çà n'importe ou dans votre code mais si vous voulez un bouton... il faut bien écrire l'instruction qui va le fabriquer.
    Pas facile non plus de savoir où, ni comment l'afficher.

    do_replay est un "callback". Ce que vous voulez qui se passe lorsqu'on cliique sur le bouton: un peu de ménage avant de remettre le couvert. Que faut-il débarrasser? Que faut-il recréer? seul vous le savez (peut-être).

    Et ça ne vous aide pas plus que le "Yes it is" de tout à l'heure.
    Mais si vous ne postez pas un peu de votre code pour voir où et comment planter çà, il va falloir vous en contenter.

    - W

  5. #5
    Candidat au Club
    Femme Profil pro
    étudiante
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : étudiante
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Bah... En fait, c'est très simple. Par contre c'est pas fastoche à raconter. En fait, "raconter" çà se fait avec des mots techniques. Les mots techniques recouvrent des concepts que demanderaient à être définis, histoire d'être compris.
    Mais bon si "chaise", "table", ... sont des concepts partagés: cycle de vie d'une application, d'un objet, appel de fonction callback, ... vous échappent encore, sinon vous ne poseriez pas ce genre de question.

    A défaut de partager un vocabulaire, on peut l'illustrer avec du code.
    Pour faire simple, il faut déjà commencer par écrire un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tk.Button(..., text='replay', command=do_replay)
    Et voilà! on a le bouton.
    Pas facile de planter çà n'importe ou dans votre code mais si vous voulez un bouton... il faut bien écrire l'instruction qui va le fabriquer.
    Pas facile non plus de savoir où, ni comment l'afficher.

    do_replay est un "callback". Ce que vous voulez qui se passe lorsqu'on cliique sur le bouton: un peu de ménage avant de remettre le couvert. Que faut-il débarrasser? Que faut-il recréer? seul vous le savez (peut-être).

    Et ça ne vous aide pas plus que le "Yes it is" de tout à l'heure.
    Mais si vous ne postez pas un peu de votre code pour voir où et comment planter çà, il va falloir vous en contenter.

    - W

    Oulala c'est compliqué en effet, mais j'aurais une autre question plus simple, j'ai deux fenêtres sur tkinter, au départ la première sert à demander à l'utilisateur d'entrer son prénom, ensuite il y a un bouton JOUER, et j'aimerais que lorsqu'il clique sur ce bouton, la 2e fenêtre s'affiche (celle où il y a le jeu) mais en supprimant la 1ère. Comment faire? il faut tuliser "fen.destroy()" je pense mais je ne sais pas comment l'insérer ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Citation Envoyé par lostperson Voir le message
    Comment faire? il faut tuliser "fen.destroy()" je pense mais je ne sais pas comment l'insérer ?
    "comment faire": pour insérer l'instruction "fen.destroy()" dans votre code, çà se fait avec vos doigts sur votre clavier.
    Une meilleure question serait "où"... mais la encore, sans montrez pas un peu de code, on sait pas.

    - W

  7. #7
    Candidat au Club
    Femme Profil pro
    étudiante
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : étudiante
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    "comment faire": pour insérer l'instruction "fen.destroy()" dans votre code, çà se fait avec vos doigts sur votre clavier.
    Une meilleure question serait "où"... mais la encore, sans montrez pas un peu de code, on sait pas.

    - W

    J'ai résolu le pb. Dernière question, dans mon prgm j'utilise l'instruction "global", mais je ne me rappelle plus à quoi cela sert? enfin pourquoi il est nécessaire de l'utiliser ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Citation Envoyé par lostperson Voir le message
    J'ai résolu le pb. Dernière question, dans mon prgm j'utilise l'instruction "global", mais je ne me rappelle plus à quoi cela sert? enfin pourquoi il est nécessaire de l'utiliser ?
    Il n'est jamais nécessaire d'utiliser "global".
    Les débutants en abusent mais çà dépend du style de votre code.
    Et comme vous ne postez toujours pas de code..., il va falloir vous contenter de çà pour vous débrouiller.

    Vous pourriez aussi prendre l'initiative de le virer pour voir, relire votre cours ou vos tutos préférés,...

    - W

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour.
    Désolé de déterrer le topic, mais j'ai le même problème, et je n'ai pas vraiment pu le résoudre au vu des indications données.
    Il est à noté que, si j'ai des bases en python, je n'ai découvert l'interface graphique qu'il y a peu de temps. Il est donc tout à fait possible que mes erreurs soient stupides, et plus que probable que mon programme soit loin d’être optimisé !
    Bref, rentrons dans le vif du sujet. Suite à un projet d'informatique, je code un 2048. J'ai d'abord réaliser une version console (ce qui était demandé), qui marche très bien. J'ai ensuite voulu passer à la version fenêtre, qui marche aussi. J'ai créé une fonction qui exécute l'ensemble des opérations (bouger les chiffres selon une direction, générer un 2 ou un 4 au hasard, effacer ce qui était dessiner sur le canvas et redessiner les nouveauté), et je l'ai lié au touche du clavier. Cette partie marche sans problème (ou en tout cas, sans problème que j'ai pu observé).
    Ensuite, j'ai ajouter dans la fonction une vérification de blocage, ce qui correspond à la fin du jeu. La non plus, pas de problème. Si la condition est remplie, j'ai fait afficher un frame avec un petit message et 2 boutons : quitter et rejouer. Le bouton quitter marche sans problème.
    C'est donc le bouton rejouer qui est au coeur de mon problème. J'ai créer une fonction Rejouer que j'ai associer au bouton quitter, et qui dans un premier temps détruit le frame, et dans un second temps remet à 0 mon tableau qui contient les différentes valeurs, genere un 2 ou un 4 au hasard, et ré affiche le dessin. Et ca marche aussi. Le problème, c'est qu'ensuite, j'ai bien la même grille qu'en lancant le programme, avec un 2 ou un 4 quelque part, mais les touches directionnels ne répondent plus, et je ne sais pas quoi faire pour que le jeu reprenne comme avant.

    Voici des bouts de code de la condition de défaite et de ma fonction rejouer (je ne sais pas s'il vous faut autre chose) :

    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
    if not verif_blocage(Tableau,'Up') and not verif_blocage(Tableau,'Down') and not verif_blocage(Tableau,'Right') and not verif_blocage(Tableau,'Left'): #Afficher une fenetre permettant de quitter en cas de blocage
    		global Endgame
    		Endgame=Frame(racine,borderwidth=2,relief=GROOVE)
    		Endgame.pack(side=TOP,padx=50,pady=10)
    		Label(Endgame,text="Vous avez perdu",fg ='blue').pack(padx=10,pady=10)
    		Button_quit=Button(Endgame,text="Quitter",fg='navy',command=racine.destroy).pack(side = LEFT,padx=10,pady=10)
    		Button_rejouer=Button(Endgame,text="Rejouer",fg='navy',command=Rejouer).pack(side = RIGHT,padx=10,pady=10) 
     
     
     
    def Rejouer(): #fonction permettant de remettre à 0
    	Endgame.destroy()
    	Tableau={'a':0,'b':0,'c':0,'d':0,'e':0,'f':0,'g':0,'h':0,'i':0,'j':0,'k':0,'l':0,'m':0,'n':0,'o':0,'p':0} 
    	zone_dessin.delete(ALL)
    	for j in range(0,4):
    		for i in range(0,4):
    			zone_dessin.create_rectangle(125*i,125*j,125*i+125,125*j+125) #dessine le cadre
    	gen_alea_2(Tableau)
    	for j in range(0,4): #Entre les valeurs du dico dans les cases du cadre
    		for i in range(0,4):
    			txt = zone_dessin.create_text(62.5+i*125, 62.5+j*125, text=verif_nb(Tableau[trad_c2l(i,j)]), font="Arial 32", fill=couleur(verif_nb(Tableau[trad_c2l(i,j)])))
    Merci d'avance !
    Khanos

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Salut,

    Citation Envoyé par Khanos Voir le message
    Le problème, c'est qu'ensuite, j'ai bien la même grille qu'en lancant le programme, avec un 2 ou un 4 quelque part, mais les touches directionnels ne répondent plus, et je ne sais pas quoi faire pour que le jeu reprenne comme avant.
    Idéalement, il faut refaire un certain nombre d'opérations à partir d'un état défini (et connu) qui permettra de repartir à zéro.
    Lorsque vous vous contentez de relancer le programme, l'état est défini et connu par l'environnement d'exploitation: çà fonctionne parce qu'il ne vous donne pas de choix.

    Si vous voulez relancer une partie sans sortir du programme, çà se complique car l'état "défini et connu" dépendra de comment vous avez codé le tout. Réciproquement, pouvoir redémarrer va vous obliger à coder pour que... c'est une contrainte, une exigence qui n'est pas sans conséquence sur le code.

    Si vous ne postez pas plus de code, pas facile d'aller au delà de ces généralités.

    - W

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Je met tout le code dans ce cas, ça sera peut-être plus clair. Je précise qu'il n'est absolument pas optimisé, j'ai fait comme ça me venais sur le moment, il peut donc paraître... Étrange.
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
     
    # -*- coding: utf-8 -*-
    from Tkinter import *
    from random import *
    from copy import *
     
    def gen_alea_2(Tab): #Fonction permettant d obtenir un 2 aleatoirement sur une des cases vides
    	nb0=''
    	alea=0
    	for i in Tab:
    		if Tab[i]==0:
    			nb0=nb0+i
    	if nb0 != '':
    		x=int(randint(0,len(nb0)-1))
    		alea=randint(1,10)
    		if alea<10:
    	        	Tab[nb0[x]]=2
    		else:
    			Tab[nb0[x]]=4
    	        return True
    	else:
    		return False
     
     
    def verif_nb(nb): #Permet de ne pas afficher les 0 (a mettre dans chaque print) et d afficher les chiffres a peu pres au milieu (prend 4 caracteres de large)
        if nb == 0:
            return ''
        else:
            return nb
     
     
    def dico2liste(Dico,direction): #Transforme le dico en une serie de listes : colonne si on va vers le haut ou le bas, ligne si on va vers la gauche ou la droite, pour gerer ligne par ligne. On change aussi l'ordre selon le chiffre (pour commencer par le 1 de chaque liste)
        liste1=[]
        liste2=[]
        liste3=[]
        liste4=[]
        if direction == "Up":
            liste1.append(Dico['a'])
            liste1.append(Dico['e'])
            liste1.append(Dico['i'])
            liste1.append(Dico['m'])
            liste2.append(Dico['b'])
            liste2.append(Dico['f'])
            liste2.append(Dico['j'])
            liste2.append(Dico['n'])
            liste3.append(Dico['c'])
            liste3.append(Dico['g'])
            liste3.append(Dico['k'])
            liste3.append(Dico['o'])
            liste4.append(Dico['d'])
            liste4.append(Dico['h'])
            liste4.append(Dico['l'])
            liste4.append(Dico['p'])
        elif direction=="Down":
            liste1.append(Dico['m'])
            liste1.append(Dico['i'])
            liste1.append(Dico['e'])
            liste1.append(Dico['a'])
            liste2.append(Dico['n'])
            liste2.append(Dico['j'])
            liste2.append(Dico['f'])
            liste2.append(Dico['b'])
            liste3.append(Dico['o'])
            liste3.append(Dico['k'])
            liste3.append(Dico['g'])
            liste3.append(Dico['c'])
            liste4.append(Dico['p'])
            liste4.append(Dico['l'])
            liste4.append(Dico['h'])
            liste4.append(Dico['d'])
        elif direction=="Right":
            liste1.append(Dico['d'])
            liste1.append(Dico['c'])
            liste1.append(Dico['b'])
            liste1.append(Dico['a'])
            liste2.append(Dico['h'])
            liste2.append(Dico['g'])
            liste2.append(Dico['f'])
            liste2.append(Dico['e'])
            liste3.append(Dico['l'])
            liste3.append(Dico['k'])
            liste3.append(Dico['j'])
            liste3.append(Dico['i'])
            liste4.append(Dico['p'])
            liste4.append(Dico['o'])
            liste4.append(Dico['n'])
            liste4.append(Dico['m'])
        elif direction=="Left":
            liste1.append(Dico['a'])
            liste1.append(Dico['b'])
            liste1.append(Dico['c'])
            liste1.append(Dico['d'])
            liste2.append(Dico['e'])
            liste2.append(Dico['f'])
            liste2.append(Dico['g'])
            liste2.append(Dico['h'])
            liste3.append(Dico['i'])
            liste3.append(Dico['j'])
            liste3.append(Dico['k'])
            liste3.append(Dico['l'])
            liste4.append(Dico['m'])
            liste4.append(Dico['n'])
            liste4.append(Dico['o'])
            liste4.append(Dico['p'])
        return liste1,liste2,liste3,liste4
     
     
    def bouge_bloc(liste,bloc): #bouge un bloc au maximum dans la direction voulu
        k=bloc
        if liste[k] != 0:
            while liste[k-1]==0 and k !=0:
                k=k-1
        if k != bloc:
            liste[k]=liste[bloc]
            liste[bloc]=0
        return k
     
     
    def fusion(liste,bloc1,bloc2): #On fusionne 2 blocs, bloc1 etant le plus petit dans la liste
        liste[bloc1]=liste[bloc1]+liste[bloc2]
        liste[bloc2]=0
     
    def control_fusion(case,liste_fus): #On verifie si on a pas deja fusionne cette case
        if liste_fus==[]:
            return True
        for i in liste_fus:
            if i==case:
                return False
        return True
     
     
    def liste2dico(l1,l2,l3,l4,direction,Dico):
        if direction=="Up":
            Dico['a']=l1[0]
            Dico['b']=l2[0]
            Dico['c']=l3[0]
            Dico['d']=l4[0]
            Dico['e']=l1[1]
            Dico['f']=l2[1]
            Dico['g']=l3[1]
            Dico['h']=l4[1]
            Dico['i']=l1[2]
            Dico['j']=l2[2]
            Dico['k']=l3[2]
            Dico['l']=l4[2]
            Dico['m']=l1[3]
            Dico['n']=l2[3]
            Dico['o']=l3[3]
            Dico['p']=l4[3]
        if direction=="Down":
            Dico['a']=l1[3]
            Dico['b']=l2[3]
            Dico['c']=l3[3]
            Dico['d']=l4[3]
            Dico['e']=l1[2]
            Dico['f']=l2[2]
            Dico['g']=l3[2]
            Dico['h']=l4[2]
            Dico['i']=l1[1]
            Dico['j']=l2[1]
            Dico['k']=l3[1]
            Dico['l']=l4[1]
            Dico['m']=l1[0]
            Dico['n']=l2[0]
            Dico['o']=l3[0]
            Dico['p']=l4[0]
        if direction=="Left":
            Dico['a']=l1[0]
            Dico['b']=l1[1]
            Dico['c']=l1[2]
            Dico['d']=l1[3]
            Dico['e']=l2[0]
            Dico['f']=l2[1]
            Dico['g']=l2[2]
            Dico['h']=l2[3]
            Dico['i']=l3[0]
            Dico['j']=l3[1]
            Dico['k']=l3[2]
            Dico['l']=l3[3]
            Dico['m']=l4[0]
            Dico['n']=l4[1]
            Dico['o']=l4[2]
            Dico['p']=l4[3]
        if direction=="Right":
            Dico['a']=l1[3]
            Dico['b']=l1[2]
            Dico['c']=l1[1]
            Dico['d']=l1[0]
            Dico['e']=l2[3]
            Dico['f']=l2[2]
            Dico['g']=l2[1]
            Dico['h']=l2[0]
            Dico['i']=l3[3]
            Dico['j']=l3[2]
            Dico['k']=l3[1]
            Dico['l']=l3[0]
            Dico['m']=l4[3]
            Dico['n']=l4[2]
            Dico['o']=l4[1]
            Dico['p']=l4[0]
     
    def verif_blocage(Tableau,Direction): #Fonction verifiant si le tableau est bloque ou non dans une direction dans une direction
        Tableau1=deepcopy(Tableau)
        Tableau2=deepcopy(Tableau)
        l1,l2,l3,l4=dico2liste(Tableau1,Direction)
        Liste1=[l1,l2,l3,l4]
        for i in Liste1:
        	for j in range(1,4):
            	k=bouge_bloc(i,j)
            	if i[k]==i[k-1]:
                        fusion(i,k-1,k)
            liste2dico(l1,l2,l3,l4,Direction,Tableau2)
            if Tableau1 != Tableau2:
                return True
        return False
     
    def trad_c2l(j,i): #Traduit les chiffres en lettres
    	if i==0:
    		if j==0:
    			return 'a'
    		if j==1:
    			return 'b'
    		if j==2:
    			return 'c'
    		if j==3:
    			return 'd'
    	elif i==1:
    		if j==0:
    			return 'e'
    		if j==1:
    			return 'f'
    		if j==2:
    			return 'g'
    		if j==3:
    			return 'h'
    	elif i==2:
    		if j==0:
    			return 'i'
    		if j==1:
    			return 'j'
    		if j==2:
    			return 'k'
    		if j==3:
    			return 'l'
    	elif i==3:
    		if j==0:
    			return 'm'
    		if j==1:
    			return 'n'
    		if j==2:
    			return 'o'
    		if j==3:
    			return 'p'
     
    def couleur(bloc):#Fonction affichant une couleur differente en fonction de la valeur du bloc
    	if bloc==2:
    		return "purple"
    	elif bloc==4:
    		return "violet"
    	elif bloc==8:
    		return "darkblue"
    	elif bloc==16:
    		return "blue"
    	elif bloc==32:
    		return "darkgreen"
    	elif bloc==64:
    		return "lightgreen"
    	elif bloc==128:
    		return "yellow"
    	elif bloc==256:
    		return "gold"
    	elif bloc==512:
    		return "orange"
    	elif bloc==1024:
    		return "magenta"
    	elif bloc==2048:
    		return "red"
     
     
    # Prog principal 
     
    #initialisation
     
     
     
    # jeu
     
    def Rejouer(): #fonction permettant de remettre à 0
    	Endgame.destroy()
    	Tableau={'a':0,'b':0,'c':0,'d':0,'e':0,'f':0,'g':0,'h':0,'i':0,'j':0,'k':0,'l':0,'m':0,'n':0,'o':0,'p':0} 
    	zone_dessin.delete(ALL)
    	for j in range(0,4):
    		for i in range(0,4):
    			zone_dessin.create_rectangle(125*i,125*j,125*i+125,125*j+125) #dessine le cadre
    	gen_alea_2(Tableau)
    	for j in range(0,4): #Entre les valeurs du dico dans les cases du cadre
    		for i in range(0,4):
    			txt = zone_dessin.create_text(62.5+i*125, 62.5+j*125, text=verif_nb(Tableau[trad_c2l(i,j)]), font="Arial 32", fill=couleur(verif_nb(Tableau[trad_c2l(i,j)])))
     
    def clavier(event):
    	Direction = event.keysym	
    	if Direction != 'Right' and Direction != 'Left' and Direction != 'Up' and Direction != 'Down' :
    		return
    	if not verif_blocage(Tableau,Direction):
    		return
     
    	l1,l2,l3,l4=dico2liste(Tableau,Direction)
     
    	L_tot=[l1,l2,l3,l4]
     
    	fus_ctrl=[] #Liste (vide au debut) de control de fusion
     
    	for i in L_tot:
            	fus_ctrl=[]
            	for j in range(1,4):
            	    k=bouge_bloc(i,j)
            	    if i[k]==i[k-1]:
            	        if control_fusion(i[k],fus_ctrl):
            	            fusion(i,k-1,k)
            	            fus_ctrl.append(k-1)
     
    	liste2dico(l1,l2,l3,l4,Direction,Tableau)
     
    	gen_alea_2(Tableau)	
     
    	zone_dessin.delete(ALL)
    	for j in range(0,4):
    		for i in range(0,4):
    			zone_dessin.create_rectangle(125*i,125*j,125*i+125,125*j+125) #dessine le cadre
    	for j in range(0,4): #Entre les valeurs du dico dans les cases du cadre
    		for i in range(0,4):
    			txt = zone_dessin.create_text(62.5+i*125, 62.5+j*125, text=verif_nb(Tableau[trad_c2l(i,j)]), font="Arial 32", fill=couleur(verif_nb(Tableau[trad_c2l(i,j)])))
     
    	if not verif_blocage(Tableau,'Up') and not verif_blocage(Tableau,'Down') and not verif_blocage(Tableau,'Right') and not verif_blocage(Tableau,'Left'): #Afficher une fenetre permettant de quitter en cas de blocage
    		global Endgame
    		Endgame=Frame(racine,borderwidth=2,relief=GROOVE)
    		Endgame.pack(side=TOP,padx=50,pady=10)
    		Label(Endgame,text="Vous avez perdu",fg ='blue').pack(padx=10,pady=10)
    		Button_quit=Button(Endgame,text="Quitter",fg='navy',command=racine.destroy).pack(side = LEFT,padx=10,pady=10)
    		Button_rejouer=Button(Endgame,text="Rejouer",fg='navy',command=Rejouer).pack(side = RIGHT,padx=10,pady=10) 
     
    Tableau={'a':0,'b':0,'c':0,'d':0,'e':0,'f':0,'g':0,'h':0,'i':0,'j':0,'k':0,'l':0,'m':0,'n':0,'o':0,'p':0} #Dico reprenant les 16 cases (de a a p) du 2048
     
    racine= Tk()
    zone_dessin = Canvas(racine, width=500, height=500) #Définit les dimensions du canevas
    zone_dessin.pack() #Affiche le canevas
    racine.title("2048")
    for j in range(0,4):
    	for i in range(0,4):
    		zone_dessin.create_rectangle(125*i,125*j,125*i+125,125*j+125) #dessine le cadre
     
    zone_dessin.focus_set()
    zone_dessin.bind("<Key>", clavier)
    zone_dessin.pack()
     
    gen_alea_2(Tableau)
    for j in range(0,4): #Entre les valeurs du dico dans les cases du cadre
    		for i in range(0,4):
    			txt = zone_dessin.create_text(62.5+i*125, 62.5+j*125, text=verif_nb(Tableau[trad_c2l(i,j)]), font="Arial 32",fill=couleur(verif_nb(Tableau[trad_c2l(i,j)])))
    racine.mainloop()
    Ce que j'ai du mal à comprendre, c'est ce qui a changer entre le moment où je joue normalement (déplacement en appuyant sur une fleche pour activer ma fonction clavier) et le moment où j'utilise la fonction Rejouer.
    Pour moi, je refais la même chose, à la différence près que je remet à 0 mon tableau. Je ne comprend donc pas pourquoi la fonction n'est plus associer à une touche comme avant.
    Si je dois modifier mon code, ca sera avec plaisir, mais je suis un peu perdu pour l'instant, et je ne sais pas dans quelle direction m'orienter.
    Merci d'avance !

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Salut,

    Citation Envoyé par Khanos Voir le message
    Pour moi, je refais la même chose, à la différence près que je remet à 0 mon tableau. Je ne comprend donc pas pourquoi la fonction n'est plus associer à une touche comme avant.
    C'est une théorie. Pour la "tester", il vous suffit d'ajouter un "print" au début de la fonction clavier pour vérifier si les flèches déclenchent toujours ce callback après être passé dans "rejouer".

    - W

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    J'ai mis des print partout, et j'ai fini par comprendre.
    En fait, je pensais que comme les listes, les dictionnaires étaient définis globalement, ce qui n'est pas le cas. Le dictionnaire que je remettais à 0 dans la fonction Rejouer était juste local, il n'était pas modifié à posteriori. J'avais donc le bon affichage, mais pour le programme, le dictionnaire était toujours pleins, et s’arrêtait donc après ma fonction verif_blocage.
    J'ai rajouter un global Tableau, modifier les fois où j'avais appelé ma variable Tableau, et ça marche !
    Merci du coup !

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Salut,

    Citation Envoyé par Khanos Voir le message
    J'ai mis des print partout, et j'ai fini par comprendre.
    Bravo!

    Citation Envoyé par Khanos Voir le message
    En fait, je pensais que comme les listes, les dictionnaires étaient définis globalement, ce qui n'est pas le cas. Le dictionnaire que je remettais à 0 dans la fonction Rejouer était juste local, il n'était pas modifié à posteriori
    global et local définissent la portée de variables.
    list et dict sont des objets.
    Lorsque vous écrivez: "tableau = {}" ou "tableau = []", vous assignez un (nouvel) objet à une variable.
    Si vous voulez remettre toutes les valeurs de Tableau, vous pouviez aussi écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for key in Tableau:
         Tableau[key] = 0
    Dans ce cas, on assigne pas un nouveau dict à Tableau mais on met à jour l'objet existant.

    - W

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/03/2014, 19h09
  2. [Tkinter] Python 2.6 - Quel outil utiliser en remplacement du print()
    Par sir_nebuchadnezzar dans le forum Général Python
    Réponses: 16
    Dernier message: 20/11/2012, 09h51
  3. Webbrowser Tkinter Python
    Par Nifaste dans le forum Tkinter
    Réponses: 3
    Dernier message: 03/01/2010, 10h20
  4. Un bouton "rejouer" pour relancer un swf
    Par nicolas2603 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 06/05/2009, 10h11
  5. [Tkinter] Python sous Linux
    Par PMdomine dans le forum Tkinter
    Réponses: 7
    Dernier message: 06/03/2006, 20h56

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