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 :

Aide pour un programme Scrabble tkinter


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Aide pour un programme Scrabble tkinter
    Salut tout le monde : J'ai besoin d'aide pour mon projet ISN, on a essayé de faire un scrabble ou a entraineur de scrabble sur Tkinter. Je suis face a plusieurs problemes presque impossible a résoudre pour moi si vous pouvez m'aider please :
    Je mettrais mon code a la fin
    je souhaiterais faire un bouton retour en arrière pour enlever la lettre afficher sur le cadre et la remettre dans la pioche ( les boutons en bas ) grace au bouton retour mais je n'arrive pas a remettre le bouton juste a enlever la lettre du cadre si quelqu'un peut m'aider c'est la fonction UNDO
    J'aimerais aussi faire que lorsqu'on choisit que 5 lettres sur les 7 par exemple et qu 'on rappuie sur le bouton pioche juste les lettres effaces se renouvellent mais pas les anciennes ,j'ai reussi mais les lettres qui sont restés on change de lettres lorsqu'on clique sur le cadre elles ne correspondent plus a celles affichés sur le bouton c'est la fonction "PIOCHE" qu'il faut modifier . Si quelqu'un trouve une solution ca serait sympa.
    Voici mon code, regarder juste les fonctions ou il ya un probleme parce qu'il est un peu long :
    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
    from tkinter import*
    from random import *
    from tkinter import messagebox
    import itertools as it
     
    cadre=Tk()
    cadre.title("Scrabble")
     
    dessin=Canvas(cadre, width=500, height=500)
    dessin.grid(row = 0, column = 0)
     
    L_statique = ['a','a','a','a','a','a','a','a','a', 'b','b','c','c','d','d','d','e','e','e','e','e','e','e','e','e','e','e','e','e','e','e','f','f','g','g','h','h','i','i','i','i','i','i','i','i','j','k','l','l','l','l','l','m','m','m','n','n','n','n','n','n','o','o','o','o','o','o','p','p','q','r','r','r','r','r','r','s','s','s','s','s','s','t','t','t','t','t','t','u','u','u','u','u','u','v','v','w','x','y','z']
     
    L = ['a','a','a','a','a','a','a','a','a', 'b','b','c','c','d','d','d','e','e','e','e','e','e','e','e','e','e','e','e','e','e','e','f','f','g','g','h','h','i','i','i','i','i','i','i','i','j','k','l','l','l','l','l','m','m','m','n','n','n','n','n','n','o','o','o','o','o','o','p','p','q','r','r','r','r','r','r','s','s','s','s','s','s','t','t','t','t','t','t','u','u','u','u','u','u','v','v','w','x','y','z']
     
    detruit1 = True
    detruit2 = True
    detruit3 = True
    detruit4 = True
    detruit5 = True
    detruit6 = True
    detruit7 = True
     
    # fonction permettant l'importation d'un fichier sur python et de le mettre sous forme de liste #
    def generer_liste(chemin, liste):
        liste_temporaire=[]
        fichier = open(chemin, "r")
        liste_temporaire = fichier.readlines()
        fichier.close()
        for element in liste_temporaire:
            liste.append(element[0: -1])
        return liste
     
    def repondre():
    # Python reconnait le type de variable ainsi, il n'est pas obligatoire d'ecrire str. #
    # Le joueur entre un mot #
        nouveau = mot.get()
        nouveau = nouveau.lower()
     
     
        mot_dans_ordre_alphabetique = []
     
     
     
     
        n = len(nouveau)
        while n>0:
     
            # Importation du module itertools pour utiliser une des ces fonctions #
            import itertools as it
            # Creation d'un ensemble compose de toutes les permutation du mot entre grace a la fonction «permutations» provenant du module itertools #
            # Fabrication de la liste "anagramme" des chaines de caracteres element quand les elements parcourent les tuples creer par la fonction permutations de la liste dont les parametres sont : mot, nombre de lettres du mot #
            anagramme = set("".join(element) for element in it.permutations(nouveau, n))
            n = n - 1
     
            # Creation de l'ensemble "mots_communs" compose de l'intersection des deux ensembles (anagramme et dictionnaire) #
            mots_communs = anagramme & dictionnaire
     
            # Transformation de l'ensemble "mots_communs" en liste intitule "mot_dans_ordre_alphabetique" #
            mot_dans_ordre_alphabetique.append(list(mots_communs))
            # Les elements de la liste "mot_dans_ordre_alphabetique" sont mis dans l'ordre alphabetique" #
            #mot_dans_ordre_alphabetique.sort()
            list(mot_dans_ordre_alphabetique)
            #ls = (  list.join( mot_dans_ordre_alphabetique))
            ls = [x for u in mot_dans_ordre_alphabetique for x in u ]
     
     
            if len(mots_communs) == 0:
            # Si la liste est vide #
            # Si la liste est vide #
                affichage['text'] = "Pas d'anagramme de ce mot possible."
            else:
     
                affichage['text'] = ls
     
     
     
     
    x = 2
    def joker ():
        global x
        if x > 0:
     
            fenetre= Tk()
            fenetre.title("Joker")
     
            global mot, dictionnaire, affichage
            # Creation d'une liste vide "dictionnaire" pour faire fonctionner la fonction generer_liste #
            dictionnaire = []
     
            # Importation du dictionnaire de la langue francaise sans accent et le transformer en liste #
            generer_liste("dico.txt", dictionnaire)
     
            # Transformer la liste "dictionnaire " en un ensemble #
            dictionnaire = set(dictionnaire)
     
     
            titre = Label(fenetre, text = 'veuillez entrer un mot sans accent pour afficher le joker:')
            mot = Entry(fenetre)
     
            valeur = Button(fenetre, text =' Valider', command=repondre)
            affichage = Label(fenetre, width=7000, height = 10)
     
            bouton_quitter_2 = Button(fenetre, text="Quitter", command=fenetre.quit) # Creation d'une commande pour quitter la fenetre #
     
            titre.pack()
            mot.pack()
            valeur.pack()
            affichage.pack()
            bouton_quitter_2.pack()
            fenetre.mainloop()
            fenetre.destroy()
            x = x - 1
        else:
            messagebox.showwarning('Scrabble', 'vous avez  déjà utilisé vos deux joker')
     
     
    def validation ():
     
     
        mot_valide = mot.get()
        mot_valide = set(mot_valide)
        # Creation d'une liste vide "dictionnaire" pour faire fonctionner la fonction generer_liste #
        dictionnaire = []
     
        # Importation du dictionnaire de la langue francaise sans accent et le transformer en liste #
        generer_liste("dico.txt", dictionnaire)
     
        # Transformer la liste "dictionnaire " en un ensemble #
        dictionnaire = set(dictionnaire)
     
     
     
        mot_commun = mot_valide & dictionnaire
     
        if len(mot_commun) == 0:
            messagebox.showwarning('Scrabble', 'le mot que vous venez de valider n est pas français, il ne peut être accepté. Veuillez rejouer.')
        else:
            messagebox.showwarning('Scrabble', 'Bien joué !')
     
     
    def valide():
        fen =Tk()
        fen.title("Verification")
        global mot, dictionnaire, affichage1
        # Creation d'une liste vide "dictionnaire" pour faire fonctionner la fonction generer_liste #
        dictionnaire = []
     
        # Importation du dictionnaire de la langue francaise sans accent et le transformer en liste #
        generer_liste("dico.txt", dictionnaire)
     
        # Transformer la liste "dictionnaire " en un ensemble #
        dictionnaire = set(dictionnaire)
     
     
        titre1 = Label(fen, text = 'veuillez entrer un mot sans accent pour afficher le joker:')
        mot = Entry(fen)
     
        valeur1 = Button(fen, text =' Valider', command=validation)
        affichage1 = Label(fen, width=70)
     
        bouton_quitter_3 = Button(fen, text="Quitter", command=fen.quit) # Creation d'une commande pour quitter la fenetre #
     
        titre1.pack()
        mot.pack()
        valeur1.pack()
        affichage1.pack()
        bouton_quitter_3.pack()
        fen.mainloop()
        fen.destroy()    
    def lettreb(i):
            global detruit1, detruit2, detruit3, detruit4, detruit5, detruit6, detruit7, lettre
            lettre = lettrevariable[i]
            if i == 0 :
                bouton_1.destroy()
                detruit1 =  True
            if i == 1 :
                bouton_2.destroy()
                detruit2 = True
            if i == 2:
                bouton_3.destroy()
                detruit3 = True
            if i == 3:
                bouton_4.destroy()
                detruit4 = True
            if i == 4:
                bouton_5.destroy()
                detruit5 = True
            if i == 5 :
                bouton_6.destroy()
                detruit6 = True
            if i == 6:
                bouton_7.destroy()
                detruit7 = True
     
    def pioche():
        global bouton_1, bouton_2, bouton_3, bouton_4, bouton_5, bouton_6, bouton_7, detruit1, detruit2, detruit3, detruit4, detruit5, detruit6, detruit7,L, lettrevariable
     
        if len(L)>=8:
            lettrevariable = [0]*8
            for i in range(8) :
                lettrevariable[i] = choice(L)
                L.remove(lettrevariable[i])
     
     
            if detruit1 == True:
                bouton_1 = Button(cadre, text= lettrevariable[0] , command=lambda arg =0 :lettreb(arg))
                bouton_1.grid(row = 1, column = 0)
            if i != 0:
                detruit1 = False
     
     
     
            if detruit2 == True:
                bouton_2 = Button(cadre, text= lettrevariable[1] , command=lambda arg =1 :lettreb(arg))
                bouton_2.grid(row = 1, column = 1)
            if i != 1:
                detruit2 = False
     
     
     
            if detruit3 == True:
                bouton_3 = Button(cadre, text= lettrevariable[2] , command=lambda arg =2 :lettreb(arg))
                bouton_3.grid(row = 1, column = 2)
            if i != 2:
                detruit3 = False
     
     
     
            if detruit4 == True:
                bouton_4 = Button(cadre, text= lettrevariable[3] , command=lambda arg =3 :lettreb(arg))
                bouton_4.grid(row = 1, column = 3)
            if i != 3:
                detruit4 = False
     
     
     
            if detruit5 == True:
                bouton_5 = Button(cadre, text= lettrevariable[4] , command=lambda arg =4 :lettreb(arg))
                bouton_5.grid(row = 1, column = 4)
            if i != 4:
                detruit5 = False
     
     
     
            if detruit6 == True:
                bouton_6 = Button(cadre, text= lettrevariable[5] , command=lambda arg =5 :lettreb(arg))
                bouton_6.grid(row = 1, column = 5)
            if i != 5:
                detruit6 = False
     
     
            if detruit7 == True:
                bouton_7 = Button(cadre, text= lettrevariable[6] , command=lambda arg =6 :lettreb(arg))
                bouton_7.grid(row = 1, column = 6)
            if i != 6:
                detruit7 = False
     
     
        if bouton_1.cget('text') == '' and bouton_2.cget('text') == '' and bouton_3.cget('text') == '' and bouton_4.cget('text') == '' and bouton_5.cget('text') == '' and bouton_6.cget('text') == '' and bouton_7.cget('text') == '':
            messagebox.showinfo('Scrabble', 'Vous avez fini la partie!')
     
        for Samuel in range(8-len(L)):
            L.append('')
     
    global abscase,ordcase
        #Creation d'un tableau
     
    tableau = 15*[0]
     
    for i in range(len(tableau)) :
        tableau[i] = 15*[0]
     
     
    ##-----Définition des Fonctions-----##
    def cliquer(event):
        """Cette fonction trace un cercle rouge sous la souris dans le Canvas."""
        global drapeau, cercle, abscase,ordcase
        drapeau = 1                                                                  ## On lève le drapeau
        abscisse = event.x                                                              ## Abscisse de la souris
        ordonnee = event.y
     
     
        abscase = abscisse/33 -0.15
        ordcase = ordonnee/33 - 0.15
        abscase =int(abscase) + 0.5
        ordcase = int(ordcase) + 0.5
        abscases = int(abscase)
        ordcases= int(ordcase)
     
     
     
        if tableau[abscases][ordcases] == 0:
     
     
        ## Ordonnée de la souris
        ## Tracé du cercle :
            cercle=dessin.create_text(abscase*33 ,ordcase*33 , text=lettre)
            tableau[abscases][ordcases]= lettre
            objet.append(cercle)
     
        else : 
            ancienne =dessin.cerclecget(cercle, 'text')
            dessin.delete(cercle)                                                                   
    def Undo():
        """ Efface le dernier cercle"""
        if objet != []:
            jeton = objet[-1]
            # on efface le cercle
            dessin.delete(jeton)
            # on supprime l'cercle de la liste
            del objet[-1]
     
     
     
    def lacher(event):
        """Cette fonction relache le cercle lorsque le bouton de la souris n'est plus enfoncé."""
        global drapeau
        drapeau = 0                                                                     ## On baisse le drapeau
    def deplacer(event):
        """Cette fonction conserve le cercle rouge sous la souris tant que le bouton de la souris n'est pas relâché."""
        global drapeau, cercle
        if drapeau == 1:                                                                ## Si le drapeau est levé
            abscisse = event.x                                                          ## Abscisse de la souris
            ordonnee = event.y                                                          ## Ordonnée de la souris
     
            ## Re-définition des coordonnées du cercle
            dessin.coords(cercle, abscase*33   ,ordcase*33  )
    objet=[]
     
    ##-----Programme principal-----##
    drapeau = 0                                                                         ## Variable globale
    cercle = 0                                                                          ## D'abord 0 avant d'être un objet
    cursor="arrow"
    dessin.bind("<Button-1>", cliquer)
    dessin.bind("<ButtonRelease-1>", lacher)
    dessin.bind("<Motion>", deplacer)
     
    for k in range(16):
        dessin.create_line(0, 33*k+3, 500, 33*k+3, width=1)
        dessin.create_line(33*k+3, 0, 33*k+3, 500, width=1)
     
     
    bouton_pioche = Button(cadre, text="pioche", command=pioche)
    bouton_quitter = Button(cadre, text="Quitter", command=cadre.quit)
    bouton_joker = Button(cadre, text="joker", command=joker)
    bouton_verification= Button(cadre, text="verification", command=valide)
    BoutonEffacer = Button(cadre, text ='Retour', command = Undo)
     
    dessin.grid(row = 0, column = 0, columnspan = 8)
    bouton_quitter.grid(row = 1, column = 10)
    bouton_pioche.grid(row = 1, column = 9)
    bouton_joker.grid(row = 1, column = 8)
    bouton_verification.grid(row= 1,column = 7)
    BoutonEffacer.grid(row=1, column= 11)
     
    cadre.mainloop()
    cadre.destroy()

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

    Citation Envoyé par yohan69 Voir le message
    je souhaiterais faire un bouton retour en arrière pour enlever la lettre afficher sur le cadre et la remettre dans la pioche ( les boutons en bas ) grace au bouton retour mais je n'arrive pas a remettre le bouton juste a enlever la lettre du cadre si quelqu'un peut m'aider c'est la fonction UNDO
    Je peux essayer de vous expliquer la logique à réaliser, à vous ensuite d'intégrer la chose dans votre programme.
    Puisqu'on est dans "la logique", on met de côté votre programme et on essaie de réaliser çà tranquille sur un coin de table.

    Imaginons une liste de boutons: A Z E R T Y.
    Lorsque l'utilisateur "clique" sur un des boutons, la lettre s'efface et va s'empiler sur la ligne suivante.
    Exemple:
    on part de:
    A Z E R T Y

    si on clique sur E, çà devient:
    A Z R T Y
    E

    puis si on clique sur Y ca devient:
    A Z R T
    E Y

    Pour l'instant, on ne parle pas d'undo et pour coder çà, c'est assez "simple" car il suffit de gérer un index.

    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
    import tkinter as tk
     
    ix = 0
     
    def do_select(btn):
        global ix
     
        label = labels[ix]
        ch = btn['text']
        btn.configure(text=' ', state='disable')
        label['text'] = ch
        ix += 1
     
     
    root = tk.Tk()
    choices = 'AZERTY'
     
    frame = tk.Frame(root)
    labels = []
     
    for x, ch in enumerate(choices):
        btn = tk.Button(frame, text=ch)
        btn['command'] = lambda btn=btn: do_select(btn)
        btn.grid(row=0, column=x)
     
        label = tk.Label(frame, text=' ')
        label.grid(row=1, column=x)
        labels.append(label)
     
    frame.pack()
    tk.mainloop()
    Compliquons la chose avec "undo".
    undo doit défaire ce qui a été fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        ch = btn['text']
        btn.configure(text=' ', state='disable')
        label['text'] = ch
    Dit autrement, on peut avoir une fonction "apply_command" qui fait le boulot et retourne ce qu'il faut pour le défaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def apply_command(btn, label):
     
        ch = btn['text']
        btn.configure(text=' ', state='disable')
        label['text'] = ch
     
        def _undo():
            btn.configure(text=ch, state='normal')
            label['text'] = ' '
     
        return _undo
    Comme c'est plus compliquer que gérer un compteur, on va utiliser une liste "undo_stack" pour récupérer les fonctions _undo à appeler lorsqu'on cliquera sur "undo".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    undo_stack = []
     
    def do_select(btn): 
        x = len(undo_stack)
        label = labels[x]
        undo_stack.append( apply_command(btn, label) )
     
    def do_undo():
        if not len(undo_stack):
            return
        undo_stack.pop(-1)()
    et voilà, il n'y a plus qu'a ajouter le bouton "undo"...
    Le programme complet:

    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
    import tkinter as tk
     
    def apply_command(btn, label):
     
        ch = btn['text']
        btn.configure(text=' ', state='disable')
        label['text'] = ch
     
        def _undo():
            btn.configure(text=ch, state='normal')
            label['text'] = ' '
     
        return _undo
     
    undo_stack = []
     
    def do_select(btn): 
        x = len(undo_stack)
        label = labels[x]
        undo_stack.append( apply_command(btn, label) )
     
    def do_undo():
        if not len(undo_stack):
            return
        undo_stack.pop(-1)()
     
     
    root = tk.Tk()
    choices = 'AZERTY'
     
    frame = tk.Frame(root)
    labels = []
     
    for x, ch in enumerate(choices):
        btn = tk.Button(frame, text=ch)
        btn['command'] = lambda btn=btn: do_select(btn)
        btn.grid(row=0, column=x)
     
        label = tk.Label(frame, text=' ')
        label.grid(row=1, column=x)
        labels.append(label)
     
    frame.pack()
     
    tk.Button(root, text='undo', command=do_undo).pack()
     
    tk.mainloop()
    La logique est assez simple à comprendre:
    1. on applique les changements et on retourne la fonction qui permet de les défaire,
    2. on empile les fonctions pour défaire.
    3. si on doit défaire, on retire la dernière fonction de la pile et on l'appelle.


    Si vous avez compris, çà ne devrait pas être "trop compliqué" à intégrer dans votre programme.

    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci j'ai compris le principe , presque tous compris sauf que je n'avais jamais vu avant un index. Je vais essayer de l'adapter, et je vous tiens au courant merci

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Probleme label
    Salut wiztrick et les autres
    je n'arrive vraiment pas a faire ta technique, pourtant j'ai compris faire une pile de chaque changement activé (fonction) dans undo_stack et puis l'enlever sauf que tu utilises un label et moi l'evenement cliquer . J'arrive pas à passer de label au clique gauche et à chaque fois le tableau du scrabble s'enleve car j'arrive pas a placer les boutons ... voila ce que j'ai essayer :
    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
    from tkinter import * # importation de tous les modules
    from random import * # fonction choice
    from tkinter import messagebox # utilisation des messages
    def apply_command(btn, label):
     
        lettre = btn['text']
        btn.configure(text=' ', state='disable')
        label['text'] = lettre
     
        def _undo():
            btn.configure(text=lettre, state='normal')
            label['text'] = ' '
     
        return _undo
     
    undo_stack = []
     
    def do_select(btn): 
        x = len(undo_stack)
        label = labe[x]
        undo_stack.append( apply_command(btn, label) )
     
    def do_undo():
        if not len(undo_stack):
            return
        undo_stack.pop(-1)()
     
    def cliquer(event):
        """fonction permettant de tracer la lettre dans le Canvas."""
        global drapeau, cercle, abscase,ordcase, lettre
        drapeau = 1                                                                  
        abscisse = event.x                                                              
        ordonnee = event.y
     
     
        abscase = abscisse/33 -0.15
        ordcase = ordonnee/33 - 0.15
        abscase =int(abscase) + 0.5
        ordcase = int(ordcase) + 0.5
        abscases = int(abscase)
        ordcases= int(ordcase)
     
     
     
     
        cercle=dessin.create_text(abscase*33 ,ordcase*33 , text=lettre)
     
     
     
     
    cadre = Tk()
     
     
    dessin=Canvas(cadre, width=500, height=500)
    labe = []
    for k in range(16):
        dessin.create_line(0, 33*k+3, 500, 33*k+3, width=1)
        dessin.create_line(33*k+3, 0, 33*k+3, 500, width=1) 
     
    L = ['A','A','A','A','A','A','A','A','A', 'B','B','C','C','D','D','D','E','E','E','E','E','E','E','E','E','E','E','E','E','E','E','F','F','G','G','H','H','I','I','I','I','I','I','I','I','J','K','L','L','L','L','L','M','M','M','N','N','N','N','N','N','O','O','O','O','O','O','P','P','Q','R','R','R','R','R','R','S','S','S','S','S','S','T','T','T','T','T','T','U','U','U','U','U','U','V','V','W','X','Y','Z']
     
    def pioche(): 
        global L
        if len(L)>=8:
            lettrevariable = [0]*8
            for i in range(8) :
                lettrevariable[i] = choice(L)
                L.remove(lettrevariable[i])    
     
     
     
            for x, lettre in enumerate(lettrevar):
                btn = Button(dessin, text=lettre)
                btn['command'] = lambda btn=btn: do_select(btn)
                btn.grid(row=0, column=x)
                lettre = lettrevar[x]
     
                label = Label(dessin, text=' ')
                label.grid(row=6, column=x)
                labe.append(label)
     
    dessin.grid(row = 0, column = 0) 
    Button(cadre, text='undo', command=do_undo).grid(row = 5001, column= 2)
    dessin.bind("<Button-1>", cliquer)
    Button(cadre, text ='pioche', command=pioche).grid(row = 2,column=3) 
    cadre.mainloop()
    cadre.destroy()
    Tu pourrais m'aider ( ou quelqu'un d'autre bien sur ) stp mais pas sur ce code la sur lui directement
    Au fait j'ai résolu l'autre probleme dans mon premier post !! Mais malgré ta reponse je galère encore

    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
     
    from tkinter import* # interface graphique
    from random import * # fonction choice
    from tkinter import messagebox # utilisation des messages
    import itertools as it # fonction permutations
     
    cadre=Tk() # fenetre nomme cadre
    cadre.title("Scrabble")
     
    dessin=Canvas(cadre, width=500, height=500)
    dessin.grid(row = 0, column = 0)
     
     
    # Liste des lettres du Scrabble
    L_statique = ['a','a','a','a','a','a','a','a','a', 'b','b','c','c','d','d','d','e','e','e','e','e','e','e','e','e','e','e','e','e','e','e','f','f','g','g','h','h','i','i','i','i','i','i','i','i','j','k','l','l','l','l','l','m','m','m','n','n','n','n','n','n','o','o','o','o','o','o','p','p','q','r','r','r','r','r','r','s','s','s','s','s','s','t','t','t','t','t','t','u','u','u','u','u','u','v','v','w','x','y','z']
     
    L = ['A','A','A','A','A','A','A','A','A', 'B','B','C','C','D','D','D','E','E','E','E','E','E','E','E','E','E','E','E','E','E','E','F','F','G','G','H','H','I','I','I','I','I','I','I','I','J','K','L','L','L','L','L','M','M','M','N','N','N','N','N','N','O','O','O','O','O','O','P','P','Q','R','R','R','R','R','R','S','S','S','S','S','S','T','T','T','T','T','T','U','U','U','U','U','U','V','V','W','X','Y','Z']
     
    detruit1 = True
    detruit2 = True
    detruit3 = True
    detruit4 = True
    detruit5 = True
    detruit6 = True
    detruit7 = True
    x = 2
     
    def generer_liste(chemin, liste):
        """fonction permettant l'importation d'un fichier sur python et de le mettre sous forme de liste"""
        liste_temporaire=[]
        fichier = open(chemin, "r")
        liste_temporaire = fichier.readlines()
        fichier.close()
        for element in liste_temporaire:
            liste.append(element[0: -1])
        return liste
     
    def repondre():
        """ fonction permettant de trouver tous les annagrammes d'une suite de caractere donne par l'utilisateur """
        nouveau = mot.get()  # Le joueur entre un mot #
        nouveau = nouveau.lower()
        mot_dans_ordre_alphabetique = []
     
        n = len(nouveau)
        while n>0:
            # Creation d'un ensemble compose de toutes les permutation du mot entre grace a la fonction «permutations» provenant du module itertools #
            # Fabrication de la liste "anagramme" des chaines de caracteres element quand les elements parcourent les tuples creer par la fonction permutations de la liste dont les parametres sont : mot, nombre de lettres du mot #
            anagramme = set("".join(element) for element in it.permutations(nouveau, n))
            n = n - 1
     
            # Creation de l'ensemble "mots_communs" compose de l'intersection des deux ensembles (anagramme et dictionnaire) #
            mots_communs = anagramme & dictionnaire
     
            # Transformation de l'ensemble "mots_communs" en liste intitule "mot_dans_ordre_alphabetique" #
            mot_dans_ordre_alphabetique.append(list(mots_communs))
            # Les elements de la liste "mot_dans_ordre_alphabetique" sont mis dans l'ordre alphabetique" #
            #mot_dans_ordre_alphabetique.sort()
            list(mot_dans_ordre_alphabetique)
            #ls = (  list.join( mot_dans_ordre_alphabetique))
            ls = [x for u in mot_dans_ordre_alphabetique for x in u ]
     
     
            if len(mots_communs) == 0:
            # Si la liste est vide #
            # Si la liste est vide #
                affichage['text'] = "Pas d'anagramme de ce mot possible."
            else:
     
                affichage['text'] =" , ".join( ls )
     
     
    def joker ():
        """ fonction permettant d'ouvrir une nouvelle fenetre pour le bouton joker et de le limiter a deux utilisations """
        global x
        if x > 0:
     
            fenetre= Tk() # fenetre nomme fenetre
            fenetre.title("Joker")
     
            global mot, dictionnaire, affichage
            # Creation d'une liste vide "dictionnaire" pour faire fonctionner la fonction generer_liste #
            dictionnaire = []
     
            # Importation du dictionnaire de la langue francaise sans accent et le transformer en liste #
            generer_liste("dico.txt", dictionnaire)
     
            # Transformer la liste "dictionnaire " en un ensemble #
            dictionnaire = set(dictionnaire)
     
     
            titre = Label(fenetre, text = 'veuillez entrer un mot sans accent pour afficher le joker:')
            mot = Entry(fenetre)
     
            valeur = Button(fenetre, text =' Valider', command=repondre)
            affichage = Label(fenetre, width=7000, height = 10)
     
            bouton_quitter_2 = Button(fenetre, text="Quitter", command=fenetre.quit) # Creation d'une commande pour quitter la fenetre #
     
            titre.pack()
            mot.pack()
            valeur.pack()
            affichage.pack()
            bouton_quitter_2.pack()
            fenetre.mainloop()
            fenetre.destroy()
            x = x - 1
        else:
            messagebox.showwarning('Scrabble', 'vous avez  déjà utilisé vos deux joker')
     
     
    def validation ():
        """ fonction permettant de verifier si un mot donne par le joueur est bien dans le dictionnaire de la langue francaise """
        mot_valide = mot.get()
        mot_valide = set(mot_valide)
        # Creation d'une liste vide "dictionnaire" pour faire fonctionner la fonction generer_liste #
        dictionnaire = []
     
        # Importation du dictionnaire de la langue francaise sans accent et le transformer en liste #
        generer_liste("dico.txt", dictionnaire)
     
        # Transformer la liste "dictionnaire " en un ensemble #
        dictionnaire = set(dictionnaire)
     
     
     
        mot_commun = mot_valide & dictionnaire
     
        if len(mot_commun) == 0:
            messagebox.showwarning('Scrabble', 'le mot que vous venez de valider n est pas français, il ne peut être accepté. Veuillez rejouer.')
        else:
            messagebox.showwarning('Scrabble', 'Bien joué !')
     
     
    def valide():
        """ fonction permettant d'ouvrir une nouvelle fenetre lors de l'utilisation du bouton verification """
        fen =Tk()
        fen.title("Verification")
        global mot, dictionnaire, affichage1
        # Creation d'une liste vide "dictionnaire" pour faire fonctionner la fonction generer_liste #
        dictionnaire = []
     
        # Importation du dictionnaire de la langue francaise sans accent et le transformer en liste #
        generer_liste("dico.txt", dictionnaire)
     
        # Transformer la liste "dictionnaire " en un ensemble #
        dictionnaire = set(dictionnaire)
     
     
        titre1 = Label(fen, text = 'veuillez entrer un mot sans accent pour afficher le joker:')
        mot = Entry(fen)
     
        valeur1 = Button(fen, text =' Valider', command=validation)
        affichage1 = Label(fen, width=70)
     
        bouton_quitter_3 = Button(fen, text="Quitter", command=fen.quit) # Creation d'une commande pour quitter la fenetre #
     
        titre1.pack()
        mot.pack()
        valeur1.pack()
        affichage1.pack()
        bouton_quitter_3.pack()
        fen.mainloop()
        fen.destroy()    
     
    def lettreb(i):
        """ fonction permettant la destruction des boutons apres leurs utilisations """
        global detruit1, detruit2, detruit3, detruit4, detruit5, detruit6, detruit7, lettre
        lettre = lettrevariable[i]
        if i == 0 :
            bouton_1.config( text = " ",state = DISABLED )
            detruit1 = True
        if i == 1 :
            bouton_2.config( text = " ",state = DISABLED )
            detruit2 = True
        if i == 2:
            bouton_3.config( text = " ",state = DISABLED )
            detruit3 = True
        if i == 3:
            bouton_4.config( text = " ",state = DISABLED )
            detruit4 = True
        if i == 4:
            bouton_5.config( text = " ",state = DISABLED )
            detruit5 = True
        if i == 5 :
            bouton_6.config( text = " ",state = DISABLED )
            detruit6 = True
        if i == 6:
            bouton_7.config( text = " ",state = DISABLED )
            detruit7 = True
    if len(L)>=8:
        lettrevariable = [0]*8
     
     
    def pioche():
        """ fonction permettant le renouvellement de lettres que si elles ont deja ete utilise, et permettant de detecter lorsque il n'y a plus de lettre dans la liste L qui represente le sac de lettre dans le jeu du Scrabble """
        global bouton_1, bouton_2, bouton_3, bouton_4, bouton_5, bouton_6, bouton_7, detruit1, detruit2, detruit3, detruit4, detruit5, detruit6, detruit7,L, lettrevariable
     
     
     
        if detruit1 == True:
            lettrevariable[0] = choice(L)
            L.remove(lettrevariable[0]) 
            bouton_1 = Button(cadre, text= lettrevariable[0] , command=lambda arg =0 :lettreb(arg))
            bouton_1.grid(row = 1, column = 0)
        if i != 0:
            detruit1 = False
     
        if detruit2 == True:
            lettrevariable[1] = choice(L)
            L.remove(lettrevariable[1]) 
            bouton_2 = Button(cadre, text= lettrevariable[1] , command=lambda arg =1 :lettreb(arg))
            bouton_2.grid(row = 1, column = 1)
        if i != 1:
            detruit2 = False
     
        if detruit3 == True:
            lettrevariable[2] = choice(L)
            L.remove(lettrevariable[2]) 
            bouton_3 = Button(cadre, text= lettrevariable[2] , command=lambda arg =2 :lettreb(arg))
            bouton_3.grid(row = 1, column = 2)
        if i != 2:
            detruit3 = False
     
        if detruit4 == True:
            lettrevariable[3] = choice(L)
            L.remove(lettrevariable[3]) 
            bouton_4 = Button(cadre, text= lettrevariable[3] , command=lambda arg =3 :lettreb(arg))
            bouton_4.grid(row = 1, column = 3)
        if i != 3:
            detruit4 = False
     
        if detruit5 == True:
            lettrevariable[4] = choice(L)
            L.remove(lettrevariable[4]) 
            bouton_5 = Button(cadre, text= lettrevariable[4] , command=lambda arg =4 :lettreb(arg))
            bouton_5.grid(row = 1, column = 4)
        if i != 4:
            detruit5 = False
     
        if detruit6 == True:
            lettrevariable[5] = choice(L)
            L.remove(lettrevariable[5]) 
            bouton_6 = Button(cadre, text= lettrevariable[5] , command=lambda arg =5 :lettreb(arg))
            bouton_6.grid(row = 1, column = 5)
        if i != 5:
            detruit6 = False
     
        if detruit7 == True:
            lettrevariable[6] = choice(L)
            L.remove(lettrevariable[6]) 
            bouton_7 = Button(cadre, text= lettrevariable[6] , command=lambda arg =6 :lettreb(arg))
            bouton_7.grid(row = 1, column = 6)
        if i != 6:
            detruit7 = False
     
        bouton_1.config(font=('courier', 20, 'bold'))
        bouton_1.config(bg='green', fg='yellow')
        bouton_1.config(height=2, width=3)
     
        bouton_2.config(font=('courier', 20, 'bold'))
        bouton_2.config(bg='green', fg='yellow')
        bouton_2.config(height=2, width=3)
     
        bouton_3.config(font=('courier', 20, 'bold'))
        bouton_3.config(bg='green', fg='yellow')
        bouton_3.config(height=2, width=3)
     
        bouton_4.config(font=('courier', 20, 'bold'))
        bouton_4.config(bg='green', fg='yellow')
        bouton_4.config(height=2, width=3)
     
        bouton_5.config(font=('courier', 20, 'bold'))
        bouton_5.config(bg='green', fg='yellow')
        bouton_5.config(height=2, width=3)
     
        bouton_6.config(font=('courier', 20, 'bold'))
        bouton_6.config(bg='green', fg='yellow')
        bouton_6.config(height=2, width=3)
     
        bouton_7.config(font=('courier', 20, 'bold'))
        bouton_7.config(bg='green', fg='yellow')
        bouton_7.config(height=2, width=3)
     
        if bouton_1.cget('text') == '' and bouton_2.cget('text') == '' and bouton_3.cget('text') == '' and bouton_4.cget('text') == '' and bouton_5.cget('text') == '' and bouton_6.cget('text') == '' and bouton_7.cget('text') == '':
            messagebox.showinfo('Scrabble', 'Vous avez fini la partie!')
     
        for Samuel in range(8-len(L)):
            L.append('')
     
    global abscase,ordcase # creation d'un tableau
     
    tableau = 15*[0]
     
    for i in range(len(tableau)) :
        tableau[i] = 15*[0]
     
     
    def cliquer(event):
        """fonction permettant de tracer la lettre dans le Canvas."""
        global  jeton, abscase,ordcase
     
        abscisse = event.x                                                              
        ordonnee = event.y
     
     
        abscase = abscisse/33 -0.15
        ordcase = ordonnee/33 - 0.15
        abscase =int(abscase) + 0.5
        ordcase = int(ordcase) + 0.5
        abscases = int(abscase)
        ordcases= int(ordcase)
     
     
     
        if tableau[abscases][ordcases] == 0:
            jeton=dessin.create_text(abscase*33 ,ordcase*33 , text=lettre)
            tableau[abscases][ordcases]= lettre
            objet.append(jeton)
     
     
     
    def Undo():
        """ fonction permettant d'effacer le dernier jeton"""
        if objet != []:
            jeton = objet[-1]
            # on efface le jeton
            dessin.delete(jeton)
            # on supprime l'jeton de la liste
            del objet[-1]
    objet=[]
     
    ##-----Programme principal-----##
                                                                    ## Variable globale
    jeton = 0                                                                          ## D'abord 0 avant d'etre un objet
    cursor="arrow"
    dessin.bind("<Button-1>", cliquer)
     
    for k in range(16):
        dessin.create_line(0, 33*k+3, 500, 33*k+3, width=1)
        dessin.create_line(33*k+3, 0, 33*k+3, 500, width=1)
     
     
    bouton_pioche = Button(cadre, text="pioche", command=pioche)
    bouton_quitter = Button(cadre, text="Quitter", command=cadre.quit)
    bouton_joker = Button(cadre, text="joker", command=joker)
    bouton_verification= Button(cadre, text="verification", command=valide)
    BoutonEffacer = Button(cadre, text ='Effacer le dernier tir', command = Undo)
     
    dessin.grid(row = 0, column = 0, columnspan = 8)
    bouton_quitter.grid(row = 1, column = 10)
    bouton_pioche.grid(row = 1, column = 9)
    bouton_joker.grid(row = 1, column = 8)
    bouton_verification.grid(row= 1,column = 7)
    BoutonEffacer.grid(row=1, column= 11)
     
    cadre.mainloop()
    cadre.destroy()

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

    Il faudrait revoir votre utilisation du geometry manager .grid, si vous faites n'importe quoi, çà fait ce que çà peut mais c'est pas joli à voir.
    Pour ce qui est d'undo, dans votre cas, le scenario est plus compliqué puisqu'il faut éventuellement défaire aussi le "cercle" placé dans le canvas.
    Et vous avez aussi à gérer la dernière lettre selectionnée: celle qu'on place...

    L'un dans l'autre, placer la lettre dans le canvas peut être "undoable"... mais çà fait plusieurs clicks sur "undo" pour défaire le tout.
    Et des scenarii à revoir: une fois la lettre placée, il faut forcer le choix d'une autre, sinon on peut encore placer la même.
    Vous avez du boulot...

    Exemple de rafistolage de votre code:
    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
     
    from tkinter import * # importation de tous les modules
    from random import * # fonction choice
    from tkinter import messagebox # utilisation des messages
     
    selected_letter = None
    undo_stack = []
     
    def apply_command(btn, label):
     
        global selected_letter
        saved_letter = selected_letter
     
        lettre = btn['text']
        btn.configure(text=' ', state='disable')
        label['text'] = lettre
        selected_letter = lettre
     
        def _undo():
            global selected_letter
            selected_letter = saved_letter  
            btn.configure(text=lettre, state='normal')
            label['text'] = ' '
     
        return _undo
     
     
    def do_select(btn):
        global undo_item
     
        x = len(undo_stack)
        label = labels[x]
        undo_stack.append( apply_command(btn, label) )
     
    def do_undo():
        global undo_item
     
        if not len(undo_stack):
            return
        undo_stack.pop(-1)()
     
    def cliquer(event):
        """fonction permettant de tracer la lettre dans le Canvas."""
        global drapeau, cercle, abscase,ordcase, lettre
        drapeau = 1                                                                  
        abscisse = event.x                                                              
        ordonnee = event.y
     
     
        abscase = abscisse/33 -0.15
        ordcase = ordonnee/33 - 0.15
        abscase =int(abscase) + 0.5
        ordcase = int(ordcase) + 0.5
        abscases = int(abscase)
        ordcases= int(ordcase)
        iid = canvas.create_text(abscase*33 ,ordcase*33 , text=selected_letter)
        undo_stack.append(lambda: canvas.delete(iid))
     
     
    def create_canvas(master):
        w = Canvas(root, width=500, height=500)
        for k in range(16):
            w.create_line(0, 33*k+3, 500, 33*k+3, width=1)
            w.create_line(33*k+3, 0, 33*k+3, 500, width=1) 
        return w
     
    labels = []
     
    root = Tk()
    canvas = create_canvas(root)
    frame = Frame(root)
     
    L = ['A','A','A','A','A','A','A','A','A', 'B','B','C','C','D','D','D','E','E','E','E','E','E','E','E','E','E','E','E','E','E','E','F','F','G','G','H','H','I','I','I','I','I','I','I','I','J','K','L','L','L','L','L','M','M','M','N','N','N','N','N','N','O','O','O','O','O','O','P','P','Q','R','R','R','R','R','R','S','S','S','S','S','S','T','T','T','T','T','T','U','U','U','U','U','U','V','V','W','X','Y','Z']
     
    def get_lettres():
        letters = L[:]
        pioche = []
        for x in range(8):
            ch = choice(letters)
            pioche.append(ch)
            letters.remove(ch)
     
        return pioche
     
    def do_pioche():  
        pioche = get_lettres()
        for x, ch in enumerate(pioche):
            btn = Button(frame, text=ch)
            btn['command'] = lambda btn=btn: do_select(btn)
            btn.grid(row=0, column=x)
     
            label = Label(frame, text=' ')
            label.grid(row=1, column=x)
            labels.append(label)
     
    canvas.grid(row = 0, column = 0)
    frame.grid(row=1, column=0)
    Button(root, text='undo', command=do_undo).grid(row = 3, column= 0)
    canvas.bind("<Button-1>", cliquer)
    Button(root, text ='pioche', command=do_pioche).grid(row = 3,column=1) 
    root.mainloop()
    Bon courage,

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut label = labels[x]
    Salut , merci bcp pour votre "rafistolage " , je l'ai utiliser mais une erreur apparait à cause de : label = labels[x] je n'ai pas compris exactement ce que c'etait au debut j'ai cru que c'etait le dernier terme d'une liste mais quand on essaie de mettre une cinquieme lettre dans le scrabble ca nous met une erreur index list out of range, j'ai pas trouvé d'ou venez le probleme et quand on rappuie sur pioche on peut remettre des lettres sur le scrabble mais pas plus de quatre...
    dans le code l'erreur apparait je comprends pas
    le code :
    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
    from tkinter import * # importation de tous les modules
    from random import * # fonction choice
    from tkinter import messagebox # utilisation des messages
    import itertools as it # fonction permutations
     
    def generer_liste(chemin, liste):
        """fonction permettant l'importation d'un fichier sur python et de le mettre sous forme de liste"""
        liste_temporaire=[]
        fichier = open(chemin, "r")
        liste_temporaire = fichier.readlines()
        fichier.close()
        for element in liste_temporaire:
            liste.append(element[0: -1])
        return liste
     
    def repondre():
        """ fonction permettant de trouver tous les annagrammes d'une suite de caractere donne par l'utilisateur """
        nouveau = mot.get()  # Le joueur entre un mot #
        nouveau = nouveau.lower()
        mot_dans_ordre_alphabetique = []
     
        n = len(nouveau)
        while n>0:
            # Creation d'un ensemble compose de toutes les permutation du mot entre grace a la fonction «permutations» provenant du module itertools #
            # Fabrication de la liste "anagramme" des chaines de caracteres element quand les elements parcourent les tuples creer par la fonction permutations de la liste dont les parametres sont : mot, nombre de lettres du mot #
            anagramme = set("".join(element) for element in it.permutations(nouveau, n))
            n = n - 1
     
            # Creation de l'ensemble "mots_communs" compose de l'intersection des deux ensembles (anagramme et dictionnaire) #
            mots_communs = anagramme & dictionnaire
     
            # Transformation de l'ensemble "mots_communs" en liste intitule "mot_dans_ordre_alphabetique" #
            mot_dans_ordre_alphabetique.append(list(mots_communs))
            # Les elements de la liste "mot_dans_ordre_alphabetique" sont mis dans l'ordre alphabetique" #
            #mot_dans_ordre_alphabetique.sort()
            list(mot_dans_ordre_alphabetique)
            #ls = (  list.join( mot_dans_ordre_alphabetique))
            ls = [x for u in mot_dans_ordre_alphabetique for x in u ]
     
     
            if len(mots_communs) == 0:
            # Si la liste est vide #
            # Si la liste est vide #
                affichage['text'] = "Pas d'anagramme de ce mot possible."
            else:
     
                affichage['text'] =" , ".join( ls )
     
     
    def joker ():
        """ fonction permettant d'ouvrir une nouvelle fenetre pour le bouton joker et de le limiter a deux utilisations """
        global y
        if y > 0:
     
            fenetre= Tk() # fenetre nomme fenetre
            fenetre.title("Joker")
     
            global mot, dictionnaire, affichage
            # Creation d'une liste vide "dictionnaire" pour faire fonctionner la fonction generer_liste #
            dictionnaire = []
     
            # Importation du dictionnaire de la langue francaise sans accent et le transformer en liste #
            generer_liste("dico.txt", dictionnaire)
     
            # Transformer la liste "dictionnaire " en un ensemble #
            dictionnaire = set(dictionnaire)
     
     
            titre = Label(fenetre, text = 'veuillez entrer un mot sans accent pour afficher le joker:')
            mot = Entry(fenetre)
     
            valeur = Button(fenetre, text =' Valider', command=repondre)
            affichage = Label(fenetre, width=7000, height = 10)
     
            bouton_quitter_2 = Button(fenetre, text="Quitter", command=fenetre.quit) # Creation d'une commande pour quitter la fenetre #
     
            titre.pack()
            mot.pack()
            valeur.pack()
            affichage.pack()
            bouton_quitter_2.pack()
            fenetre.mainloop()
            fenetre.destroy()
            y = y - 1
        else:
            messagebox.showwarning('Scrabble', 'vous avez  déjà utilisé vos deux joker')
     
     
    def validation ():
        """ fonction permettant de verifier si un mot donne par le joueur est bien dans le dictionnaire de la langue francaise """
        mot_valide = mot.get()
        mot_valide = set(mot_valide)
        # Creation d'une liste vide "dictionnaire" pour faire fonctionner la fonction generer_liste #
        dictionnaire = []
     
        # Importation du dictionnaire de la langue francaise sans accent et le transformer en liste #
        generer_liste("dico.txt", dictionnaire)
     
        # Transformer la liste "dictionnaire " en un ensemble #
        dictionnaire = set(dictionnaire)
     
     
     
        mot_commun = mot_valide & dictionnaire
     
        if len(mot_commun) == 0:
            messagebox.showwarning('Scrabble', 'le mot que vous venez de valider n est pas français, il ne peut être accepté. Veuillez rejouer.')
        else:
            messagebox.showwarning('Scrabble', 'Bien joué !')
            messagebox.showinfo('Voici votre score', scrabble_score(mot_valide))
     
     
    def valide():
        """ fonction permettant d'ouvrir une nouvelle fenetre lors de l'utilisation du bouton verification """
        fen =Tk()
        fen.title("Verification")
        global mot, dictionnaire, affichage1
        # Creation d'une liste vide "dictionnaire" pour faire fonctionner la fonction generer_liste #
        dictionnaire = []
     
        # Importation du dictionnaire de la langue francaise sans accent et le transformer en liste #
        generer_liste("dico.txt", dictionnaire)
     
        # Transformer la liste "dictionnaire " en un ensemble #
        dictionnaire = set(dictionnaire)
     
     
        titre1 = Label(fen, text = 'veuillez entrer un mot sans accent pour afficher le joker:')
        mot = Entry(fen)
     
        valeur1 = Button(fen, text =' Valider', command=validation)
        affichage1 = Label(fen, width=70)
     
        bouton_quitter_3 = Button(fen, text="Quitter", command=fen.quit) # Creation d'une commande pour quitter la fenetre #
     
        titre1.pack()
        mot.pack()
        valeur1.pack()
        affichage1.pack()
        bouton_quitter_3.pack()
        fen.mainloop()
        fen.destroy()    
     
    def scrabble_score(word):
        total = []
        for letter in word:
            total.append(score[letter.lower()])
        else:
            return sum(total)
     
    selected_letter = None
    undo_stack = []
     
    def apply_command(btn, label):
     
        global selected_letter
        saved_letter = selected_letter
     
        lettre = btn['text']
        btn.configure(text=' ', state='disable')
        label['text'] = lettre
     
        selected_letter = lettre
     
        def _undo():
            global  selected_letter
            selected_letter = saved_letter  
            btn.configure(text=lettre, state='normal')
            label['text'] = ' '
     
        return _undo
     
     
    def do_select(btn):
        global undo_item
        x = len(undo_stack)
        label = labels[x]
        undo_stack.append( apply_command(btn, label) )
     
    def do_undo():
        global undo_item, abscases, ordcases 
     
        if not len(undo_stack):
            return
        undo_stack.pop(-1)()
        tableau[abscases][ordcases] = 0
    def cliquer(event):
        """fonction permettant de tracer la lettre dans le Canvas."""
        global  cercle, abscase,ordcase, lettre, abscases , ordcases
     
        abscisse = event.x                                                              
        ordonnee = event.y
     
     
        abscase = abscisse/33 -0.15
        ordcase = ordonnee/33 - 0.15
        abscase =int(abscase) + 0.5
        ordcase = int(ordcase) + 0.5
        abscases = int(abscase)
        ordcases= int(ordcase)
        if tableau[abscases][ordcases] == 0:
            iid = canevas.create_text(abscase*33 ,ordcase*33 , text=selected_letter)
            undo_stack.append(lambda: canevas.delete(iid))
            tableau[abscases][ordcases] = 1
     
     
     
    def create_canvas(master):
        w = Canvas(cadre, width=500, height=500)
        for k in range(16):
            w.create_line(0, 33*k+3, 500, 33*k+3, width=1)
            w.create_line(33*k+3, 0, 33*k+3, 500, width=1) 
        return w
     
    def get_lettres():
        letters = L[:]
        pioche = []
        for x in range(7):
            ch = choice(letters)
            pioche.append(ch)
            letters.remove(ch)
     
        return pioche
     
    def do_pioche():  
        pioche = get_lettres()
        for x, ch in enumerate(pioche):
            btn = Button(frame, text=ch)
            btn['command'] = lambda btn=btn: do_select(btn)
            btn.config(font=('courier', 20, 'bold'), bg = 'green', fg='yellow', height=2, width=3)
            btn.grid(row=0, column=x)
     
            label = Label(frame, text=' ')
            label.grid(row=1, column=x)
            labels.append(label) 
     
     
            ##-----Programme principal-----##
     
     
    labels = []
     
    cadre = Tk()
    canevas = create_canvas(cadre)
    frame = Frame(cadre)
     
    L = ['A','A','A','A','A','A','A','A','A', 'B','B','C','C','D','D','D','E','E','E','E','E','E','E','E','E','E','E','E','E','E','E','F','F','G','G','H','H','I','I','I','I','I','I','I','I','J','K','L','L','L','L','L','M','M','M','N','N','N','N','N','N','O','O','O','O','O','O','P','P','Q','R','R','R','R','R','R','S','S','S','S','S','S','T','T','T','T','T','T','U','U','U','U','U','U','V','V','W','X','Y','Z']
     
    score = {"a": 1, "c": 3, "b": 3, "e": 1, "d": 2, "g": 2, "f": 4, "i": 1, "h": 4, "k": 5, "j": 8, "m": 3, "l": 1, "o": 1, "n": 1, "q": 10, "p": 3, "s": 1, "r": 1, "u": 1, "t": 1, "w": 4, "v": 4, "y": 4, "x": 8, "z": 10}
     
    y = 2
    couleur='green'
     
    tableau = 15*[0]
     
    for i in range(len(tableau)) :
        tableau[i] = 15*[0] 
    canevas.create_oval(235, 235, 266, 266, width=2, outline=couleur)   
     
     
     
     
    canevas.grid(row = 0, column = 0)
    frame.grid(row=1, column=0)
    Button(cadre, text='undo', command=do_undo).grid(row = 0, column= 4)
    canevas.bind("<Button-1>", cliquer)
    Button(cadre, text ='pioche', command=do_pioche).grid(row = 3,column=1)
     
    bouton_quitter = Button(cadre, text="Quitter", command=cadre.quit)
    bouton_quitter.grid(row = 3, column = 4)
     
    bouton_joker = Button(cadre, text="joker", command=joker)
    bouton_verification= Button(cadre, text="verification", command=valide) 
    bouton_joker.grid(row = 3, column = 3)
    bouton_verification.grid(row= 3,column = 2)
    cadre.mainloop()
    cadre.destroy()

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

    Si vous ne postez pas l'erreur, impossible de savoir si ce que je peux reproduire est celle dont vous parlez...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Autant pour moi
    voila quand je veux afficher une cinquieme lettre sur le scrabble ca me met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\pyzo2015a\lib\tkinter\__init__.py", line 1533, in __call__
        return self.func(*args)
      File "<tmp 1>", line 229, in <lambda>
        btn['command'] = lambda btn=btn: do_select(btn)
      File "<tmp 1>", line 177, in do_select
        label = labels[x]
    IndexError: list index out of range

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

    ah oui, maintenant qu'on empile dans undo_stack le choix de la lettre et son placement, la taille de l'undo_stack ne reflète plus l'index de la lettre qu'on veut placer.
    Ce n'est pas trop compliqué à corriger mais pas la peine d'y passer du temps avant d'avoir défini ce qu'il devrait se passer côté défaire le "placement de la lettre" et terminer "le placement".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. aide pour un programme avec PIL et Tkinter
    Par rafoim dans le forum Général Python
    Réponses: 11
    Dernier message: 15/03/2013, 07h01
  2. [débutant] besoin d'aide pour un programme
    Par acdchornet dans le forum C++
    Réponses: 12
    Dernier message: 26/10/2006, 22h32
  3. Réponses: 13
    Dernier message: 26/10/2006, 21h02
  4. [Free Pascal] Besoin d'aide pour un programme
    Par ricomix dans le forum Free Pascal
    Réponses: 3
    Dernier message: 04/06/2006, 17h01
  5. aide pour un programme a compiler
    Par letombeur dans le forum C++
    Réponses: 8
    Dernier message: 11/01/2006, 21h53

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