IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Gros problème Tkinter


Sujet :

Python

  1. #1
    Candidat au Club Avatar de MinyMiny
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Gros problème Tkinter
    Bonjour, des amis et moi nous sommes lancés dans la réalisation d'un Puissance 4 cependant nous avons un problème pour mettre en place l'interface graphique. La grille du P4 s'affiche correctement cependant il ne se passe rien quand on clique sur une case. Alors je voudrais bien savoir d'où vient ce problème et comment y remédier sachant que notre niveau de programmation est débutant. J'ai réduit le programme pour que deux joueurs puissent jouer :

    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
    from tkinter import*
    fenetre = Tk()
    import random
     
    #######FONCTIONS###########
     
    def choix_adv ():
        """permet de choisir contre qui le joueur veut jouer ainsi que les niveaux de difficulté (contre l'ordinateur)"""
        adv=int(input("Contre qui souhaitez-vous jouer : l'ordinateur ? (tapez 1) un autre joueur ? (tapez 2) "))
        if adv != 1 and adv != 2 :
            print("Veuillez choisir un nombre entre 1 et 2 !")
            choix_adv()
     
     
     
        if adv==2:
            joueur()
     
     
    def joueur() :
        """tant que la partie n'est pas gagnée, permet de changer de joueur"""
        p = 1
        gagne = False
        while not(gagne):
            jouer(p)
            gagne = verif (p)
            p = 3 - p
     
     
    def jouer(p):
        global j,i
        """demande au joueur de jouer dans quelle colonne il veut jouer + si coup impossible, fait rejouer le joueur"""
        print ("C'est au joueur",p,"de jouer :")
        j = int(input("Joueur "+str(p)+", dans quelle colonne voulez-vous jouer ? "))
     
        if j>6 or j<0 :
            print ("Impossible, veuillez choisir une colonne entre 0 et 6 !")
            return jouer(p)
        if grille[0][j]!= 0:
                print ("Impossible, veuillez jouer dans une autre colonne !")
                return jouer(p)
     
        i=0
        while i<6 and grille[i][j] == 0:
            i = i+1
        grille[i-1][j] = p
        return afficher_grille()
     
     
    def afficher_grille():
        """afficher la grille"""
        for ligne in grille:
            print(ligne)
     
    grille = [[0 for j in range(7)] for i in range(6)]
     
     
    def verif_hori (p):
        """Vérifie si il y a 4 pièces alignés horizontalement"""
        for i in range (6):
            for j in range (4):
                if grille[i][j]==grille[i][j+1]==grille[i][j+2]==grille[i][j+3]==p:
                    return True
        return False
     
     
    def verif_verti(p):
        """Vérifie si il y a 4 pièces alignés verticalement"""
        for i in range (3):
            for j in range (7):
                if grille[i][j]==p and grille[i+1][j]==p and grille[i+2][j]==p and grille[i+3][j]==p:
                    return True
     
        return False
     
     
     
    def verif_diago (p):
        """Vérifie si il y a 4 pièces alignés diagonalement"""
        for i in range (3):
            for j in range (4):
                if grille[i][j]==grille[i+1][j+1]==grille[i+2][j+2]==grille[i+3][j+3]==p:
                    return True
        for i in range (3):
            for j in range (3,7):
                if grille[i][j]==grille[i+1][j-1]==grille[i+2][j-2]==grille[i+3][j-3]==p:
                    return True
        return False
     
     
     
     
     
    def verif (p):
        """Si une vérif est OK alors on affiche le joueur qui a gagné"""
        gagne = False
     
        if verif_hori(p)== True :
            print("Le joueur", p,"a gagné !")
            gagne = True
     
     
        elif verif_verti(p)== True :
            print("Le joueur", p,"a gagné !")
            gagne = True
     
     
        elif verif_diago(p)== True :
            print("Le joueur", p,"a gagné !")
            gagne = True
     
        return gagne
     
     
     
    #creation du canevas :
    canevas=Canvas(fenetre)
    canevas.configure(width=700,height=600,bg='#0048B5')
    canevas.grid(row = 1,column = 1,padx = 20,pady = 20)
    #cercle
     
    for j in range(7):
        for i in range(6):
            canevas.create_oval(100*j+50-45,100*i+50-45,100*j+50+45,100*i+50+45,width=5,fill='white',outline='#018CD2')
     
    def case (x):
        if 0<=x<=100:
            return 0
        if 100<=x<=200:
            return 1
        if 200<=x<=300:
            return 2
        if 300<=x<=400:
            return 3
        if 400<=x<=500:
            return 4
        if 500<=x<=600:
            return 5
        if 600<=x<=700:
            return 6
     
    p = 1
     
     
    def clic(event):
        global joueur,canevas,j,p
        i = event.x
        j = case(x)
        jouer(p)
        p=3-p
     
     
        if p==1:
            for j in range(7):
                for i in range(6):
                    canevas.create_oval(100*j+50-45,100*x+50-45,100*j+50+45,100*x+50+45,width=5,fill='yellow',outline='#018CD2')
        else:
            for j in range(7):
                for i in range(6):
                    canevas.create_oval(100*j+50-45,100*x+50-45,100*j+50+45,100*x+50+45,width=5,fill='red',outline='#018CD2')
     
     
     
     
    fenetre.mainloop()
    #-------------------CORPS DU PROGRAMME----------------------
     
    choix_adv()
    (en fermant la grille du p4, vous pouvez jouer sur le shell)
    Merci d'avance !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par MinyMiny Voir le message
    La grille du P4 s'affiche correctement cependant il ne se passe rien quand on clique sur une case.
    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
    from tkinter import*
    fenetre = Tk()
    import random
     
    #######FONCTIONS###########
     
    def choix_adv ():
        """permet de choisir contre qui le joueur veut jouer ainsi que les niveaux de difficulté (contre l'ordinateur)"""
        adv=int(input("Contre qui souhaitez-vous jouer : l'ordinateur ? (tapez 1) un autre joueur ? (tapez 2) "))
        if adv != 1 and adv != 2 :
            print("Veuillez choisir un nombre entre 1 et 2 !")
            choix_adv()
     
     
     
        if adv==2:
            joueur()
     
     
    def joueur() :
        """tant que la partie n'est pas gagnée, permet de changer de joueur"""
        p = 1
        gagne = False
        while not(gagne):
            jouer(p)
            gagne = verif (p)
            p = 3 - p
     
     
    def jouer(p):
        global j,i
        """demande au joueur de jouer dans quelle colonne il veut jouer + si coup impossible, fait rejouer le joueur"""
        print ("C'est au joueur",p,"de jouer :")
        j = int(input("Joueur "+str(p)+", dans quelle colonne voulez-vous jouer ? "))
     
        if j>6 or j<0 :
            print ("Impossible, veuillez choisir une colonne entre 0 et 6 !")
            return jouer(p)
        if grille[0][j]!= 0:
                print ("Impossible, veuillez jouer dans une autre colonne !")
                return jouer(p)
     
        i=0
        while i<6 and grille[i][j] == 0:
            i = i+1
        grille[i-1][j] = p
        return afficher_grille()
     
     
    def afficher_grille():
        """afficher la grille"""
        for ligne in grille:
            print(ligne)
     
    grille = [[0 for j in range(7)] for i in range(6)]
     
     
    def verif_hori (p):
        """Vérifie si il y a 4 pièces alignés horizontalement"""
        for i in range (6):
            for j in range (4):
                if grille[i][j]==grille[i][j+1]==grille[i][j+2]==grille[i][j+3]==p:
                    return True
        return False
     
     
    def verif_verti(p):
        """Vérifie si il y a 4 pièces alignés verticalement"""
        for i in range (3):
            for j in range (7):
                if grille[i][j]==p and grille[i+1][j]==p and grille[i+2][j]==p and grille[i+3][j]==p:
                    return True
     
        return False
     
     
     
    def verif_diago (p):
        """Vérifie si il y a 4 pièces alignés diagonalement"""
        for i in range (3):
            for j in range (4):
                if grille[i][j]==grille[i+1][j+1]==grille[i+2][j+2]==grille[i+3][j+3]==p:
                    return True
        for i in range (3):
            for j in range (3,7):
                if grille[i][j]==grille[i+1][j-1]==grille[i+2][j-2]==grille[i+3][j-3]==p:
                    return True
        return False
     
     
     
     
     
    def verif (p):
        """Si une vérif est OK alors on affiche le joueur qui a gagné"""
        gagne = False
     
        if verif_hori(p)== True :
            print("Le joueur", p,"a gagné !")
            gagne = True
     
     
        elif verif_verti(p)== True :
            print("Le joueur", p,"a gagné !")
            gagne = True
     
     
        elif verif_diago(p)== True :
            print("Le joueur", p,"a gagné !")
            gagne = True
     
        return gagne
     
     
     
    #creation du canevas :
    canevas=Canvas(fenetre)
    canevas.configure(width=700,height=600,bg='#0048B5')
    canevas.grid(row = 1,column = 1,padx = 20,pady = 20)
    #cercle
     
    for j in range(7):
        for i in range(6):
            canevas.create_oval(100*j+50-45,100*i+50-45,100*j+50+45,100*i+50+45,width=5,fill='white',outline='#018CD2')
     
    def case (x):
        if 0<=x<=100:
            return 0
        if 100<=x<=200:
            return 1
        if 200<=x<=300:
            return 2
        if 300<=x<=400:
            return 3
        if 400<=x<=500:
            return 4
        if 500<=x<=600:
            return 5
        if 600<=x<=700:
            return 6
     
    p = 1
     
     
    def clic(event):
        global joueur,canevas,j,p
        i = event.x
        j = case(x)
        jouer(p)
        p=3-p
     
     
        if p==1:
            for j in range(7):
                for i in range(6):
                    canevas.create_oval(100*j+50-45,100*x+50-45,100*j+50+45,100*x+50+45,width=5,fill='yellow',outline='#018CD2')
        else:
            for j in range(7):
                for i in range(6):
                    canevas.create_oval(100*j+50-45,100*x+50-45,100*j+50+45,100*x+50+45,width=5,fill='red',outline='#018CD2')
     
     
     
     
    fenetre.mainloop()
    #-------------------CORPS DU PROGRAMME----------------------
     
    choix_adv()
    Bonjour,
    De quel endroit est lancée la fonction "clic" ?
    Généralement, la méthode "mainloop" est appelée à la fin du script.

    Il semble que le fonctionnement d'interface graphique (dirigée par les événements) ne soit pas saisie.
    Le livre (possiblement gratuit et disponible sur developpez) de G.Swinnen serait bien utile.

    En rapide:
    -> mettre en place l'interface graphique
    -> en réponse aux événements déclenchés par l'interface graphique définir des fonctions qui "répondent" aux événements.
    -> entrer dans la boucle générale de l'interface graphique (qui boucle tant qu'aucun événement n'est détecté). Ces événements détectés sont, bien entendus, définis par l'utilisateur (le nombre d'événement possible est très important), et sont liés à des fonctions (ie: point précédent).

    Clodion

  3. #3
    Candidat au Club Avatar de MinyMiny
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse Clodion
    Le "mainloop" est justement à la fin, c'est bien là qu'il doit être, non ?
    Et je ne sais où et comment placer la fonction "clic", peut-tu m'éclairer ?
    Encore merci

  4. #4
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par MinyMiny Voir le message
    Le "mainloop" est justement à la fin, c'est bien là qu'il doit être, non ?
    Et je ne sais où et comment placer la fonction "clic", peut-tu m'éclairer ?
    Bonjour,
    Non, le "mainloop()" se trouve en avant dernière position. L'appel de la fonction "choix_adv()" ne s’exécute qu'une fois sorti de la boucle graphique (de la boucle "tkinter").
    Ainsi que je le suggérais, il serait instructif (quelques dizaines de minutes au maximum) de lire attentivement le livre de G.Swinnen, surtout le chapitre 10.

    Pour un exemple:
    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
    import tkinter as tk
     
    # les fonctions executees apres action de l'utilisateur
    def coucou():
        """Affiche "coucou" ou "------" apres clic gauche sur le bouton"""
        if lab[0].cget("text") != "coucou":
            lab[0].config(text = "coucou")
        else:
            lab[0].config(text = "------")
     
    def affiche(event):
        """affiche les coordonnees de la souris sur le bouton après clic droit"""
        lab[1].config(text = event.x)
        lab[2].config(text = event.y)
     
    # Creation de l'interface graphique
    fen = tk.Tk()
     
    # fonction pour l'interface graphique
    def mes_labels(n = 3):
        lst = [] * 3
        for x in range(n):
            lst.append(tk.Label(fen, text = ""))
            lst[x].pack()
        return lst
     
    # appel de la fonction de l'interface graphique
    lab = mes_labels(3)
     
    # suite de la creation de l'interface graphique
    # avec appel d'une fonction en réponse d'une action de l'utilisateur
    bt = tk.Button(fen, text = "affiche 'coucou' pour un clic gauche", command=coucou)
    bt.pack()
    # avec appel d'une fonction en réponse d'une action de l'utilisateur: fin de la fenetre
    btq = tk.Button(fen, text = "quit", command = fen.destroy)
    btq.pack()
     
    # lien entre un clic et une fonction (deuxième forme d'interaction avec l'utilisateur)
    # affiche la position du clic sur la fenetre
    fen.bind("<Button-3>", affiche)
     
    # fenetre qui demarre la boucle necessaire au fonctionnement de l'interface
    fen.mainloop()
    Normalement le principal est dans ce script.

    Clodion

    PS: pour plus de détails sur tkinter: ici

  5. #5
    Candidat au Club Avatar de MinyMiny
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    J'ai lu un peu lu le livre que vous m'avez conseiller regarder votre algorithme mais j'ai du mal à faire le lien avec mon programme. J'ai compris comment faire le lien entre un clic et une fonction mais j'ai toujours du mal à comprendre comment récupérer les données de ce clic et placer des ronds de couleurs dans les cases voulues.
    Voilà ce que j'ai changé et j'ai toujours des erreurs :
    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
    def clic(event):
        global joueur,canevas,j,p
        i = event.x
        j = case(x)
        jouer(p)
        p=3-p
     
     
        if p==1:
            for j in range(7):
                for i in range(6):
                    canevas.create_oval(100*j+50-45,100*x+50-45,100*j+50+45,100*x+50+45,width=5,fill='yellow',outline='#018CD2')
        else:
            for j in range(7):
                for i in range(6):
                    canevas.create_oval(100*j+50-45,100*x+50-45,100*j+50+45,100*x+50+45,width=5,fill='red',outline='#018CD2')
     
     
    canevas.bind('<ButtonPress-1>',clic)
     
     
    #-------------------CORPS DU PROGRAMME----------------------
     
    choix_adv()
     
    fenetre.mainloop()
    Que faire ? Merci

  6. #6
    Membre confirmé

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

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MinyMiny Voir le message
    ... mais j'ai toujours du mal à comprendre comment récupérer les données de ce clic et placer des ronds de couleurs dans les cases voulues.
    Pour le récupérer, rien de plus simple.
    Lorsque l'on spécifie la fonction liée à un événement (ici en l’occurrence un simple clic gauche) dans la méthode bind, tkinter transmet à la fonction que tu as indiqué un objet Event.
    N'hésite pas à faire des print, dir pour bien comprendre ce que contient cet objet passé par tkinter à ta fonction clic, donc ici ce qui t'intéresses, ce sont les coordonnées X et Y du clic.

    Donc ceci n'est pas correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def clic(event):
        global joueur,canevas,j,p
        i = event.x
        j = case(x)
    x n'existe pas dans ta fonction clic.
    Ce qui t'intéresse, ce sont event.x et event.y, soit les coordonnées x et y du clic sur ton canevas.
    Un print(dir(event)) te montreras ce que event contient.

    Maintenant pour tracer un cercle sur ton canevas, il te suffit de définir une autre fonction s'occupant de cette tâche, que tu appelleras justement dans ta fonction clic.
    Le temps ronge l'amour comme l'acide.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par MinyMiny Voir le message
    J'ai lu un peu lu le livre que vous m'avez conseiller regarder votre algorithme mais j'ai du mal à faire le lien avec mon programme. J'ai compris comment faire le lien entre un clic et une fonction mais j'ai toujours du mal à comprendre comment récupérer les données de ce clic et placer des ronds de couleurs dans les cases voulues.
    Voilà ce que j'ai changé et j'ai toujours des erreurs :
    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
    def clic(event):
        global joueur,canevas,j,p
        i = event.x
        j = case(x)
        jouer(p)
        p=3-p
     
     
        if p==1:
            for j in range(7):
                for i in range(6):
                    canevas.create_oval(100*j+50-45,100*x+50-45,100*j+50+45,100*x+50+45,width=5,fill='yellow',outline='#018CD2')
        else:
            for j in range(7):
                for i in range(6):
                    canevas.create_oval(100*j+50-45,100*x+50-45,100*j+50+45,100*x+50+45,width=5,fill='red',outline='#018CD2')
     
     
    canevas.bind('<ButtonPress-1>',clic)
     
     
    #-------------------CORPS DU PROGRAMME----------------------
     
    choix_adv()
     
    fenetre.mainloop()
    Que faire ? Merci
    Bonjour,
    Il n'est pas suffisant de parcourir! Il faut au moins essayer de comprendre

    J'ai donné la structure au post 4

    Avez-vous au moins regardé ce que raconte le message d'erreur?


    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
    from tkinter import*
    fenetre = Tk()
    import random
     
     
    #creation du canevas :
    canevas=Canvas(fenetre)
    canevas.configure(width=700,height=600,bg='#0048B5')
    canevas.grid(row = 1,column = 1,padx = 20,pady = 20)
     
    #cercle
    for j in range(7):
        for i in range(6):
            canevas.create_oval(100*j+50-45,100*i+50-45,100*j+50+45,100*i+50+45,width=5,fill='white',outline='#018CD2')
     
    #Liaison avec l'utilisateur: permet de récupérer les coordonnées de la souris
    canevas.bind('<ButtonPress-1>',clic)
     
    fenetre.mainloop()
    Ici, l'affichage de la grille ainsi que le lien avec l'utilisateur sont ok.

    A vous ensuite de convertir les coordonnées (x, y) retournées par "event" pour retrouver la case correspondante et vérifier que la case est valide et tout ce qui va ensuite.

    La fonction "choix_adv ():" peut tout à fait être insérée avant le "mainloop", mais elle ne doit pas appeler la fonction "joueur" qui lance le jeu car celui-ci doit être piloté par l'interface graphique.
    C'est le clic qui va déclencher chaque étape du jeu. À chaque fois vous devrez vérifier s'il y a ou non une victoire.

    Clodion

  8. #8
    Candidat au Club Avatar de MinyMiny
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Ca y est ! J'ai réussi à colorier les cases et récupérer leurs coordonnées grâce à la fonction clic(event) mais maintenant je ne sais pas où placer le clic(event) pour qu'il coïncide avec le reste du code. Une idée ?
    Voilà ce que j'ai modifié :
    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
    def case (x):
        if 0<=x<=100:
            return 0
        if 100<=x<=200:
            return 1
        if 200<=x<=300:
            return 2
        if 300<=x<=400:
            return 3
        if 400<=x<=500:
            return 4
        if 500<=x<=600:
            return 5
        if 600<=x<=700:
            return 6
     
     
    def clic(event):
        global p,j,i
        p=2
        x = event.x
        j = case(x)
        i=0
        while i<6 and grille[i][j] == 0:
                i = i+1
        grille[i-1][j] = p
     
        print(j)
        oval()
     
     
    def oval():
        global p,j,i
        if p==1:
            for x in range(7):
                for l in range(6):
                    canevas.create_oval(100*j+50-45,100*i+50-45,100*j+50+45,100*i+50+45,width=5,fill='yellow',outline='#018CD2')
        else:
            for x in range(7):
                for l in range(6):
                    canevas.create_oval(100*j+50-45,100*i+50-45,100*j+50+45,100*i+50+45,width=5,fill='red',outline='#018CD2')
     
     
     
    canevas.bind('<ButtonPress-1>',clic)
     
     
    #-------------------CORPS DU PROGRAMME----------------------
     
     
    choix_adv()
     
    fenetre.mainloop()

  9. #9
    Membre confirmé

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

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Tu n'as pas bien compris.

    Relis un didacticiel sur tkinter comme te l'as conseillé Clodion et expérimente, teste des choses simples, car là tu fais un peu n'importe quoi sans réellement comprendre.

    Tes boucles for et while n'ont rien a faire dans tes fonctions clic et oval.

    Ta fonction clic doit récupérer les coordonnées d'un point du canevas, et les transmettre en paramètre à ta fonction oval, qui elle s'occupera de tracer un cercle en fonction de la coordonnée de ce point.
    Le temps ronge l'amour comme l'acide.

  10. #10
    Candidat au Club Avatar de MinyMiny
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bonjour, finalement je vais faire beaucoup plus simple car j'ai beau regarder des tutos, tester des trucs, lire des livres, je n'y arrive pas...
    Je n'ai vraiment pas le niveau et pas le temps non plus alors j'ai trouvé plus simple mais je suis coincé sur un truc tout bête que je n'arrive pas à comprendre :
    Pourquoi ça, fonctionne (la grille apparaît correctement) :
    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
    from tkinter import*
    def affichage():
     
     
        fenetre = Tk()
        print("test")
        canevas=Canvas(fenetre)
        canevas.configure(width=700,height=600,bg='#0048B5')
        canevas.grid(row = 1,column = 1,padx = 20,pady = 20)
     
     
        for k in range(7):
            for l in range(6):
                canevas.create_oval(100*k+50-45,100*l+50-45,100*k+50+45,100*l+50+45,width=5,fill='white',outline='#018CD2')
     
     
    affichage()
    Et pas ça (la grille ne s'affiche pas) :
    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
    from tkinter import*
    def affichage():
     
     
        fenetre = Tk()
        print("test")
        canevas=Canvas(fenetre)
        canevas.configure(width=700,height=600,bg='#0048B5')
        canevas.grid(row = 1,column = 1,padx = 20,pady = 20)
     
     
        for k in range(7):
            for l in range(6):
                canevas.create_oval(100*k+50-45,100*l+50-45,100*k+50+45,100*l+50+45,width=5,fill='white',outline='#018CD2')
     
    def test():
        affichage()

  11. #11
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par MinyMiny Voir le message
    Bonjour, finalement je vais faire beaucoup plus simple car j'ai beau regarder des tutos, tester des trucs, lire des livres, je n'y arrive pas...
    Je n'ai vraiment pas le niveau et pas le temps non plus alors j'ai trouvé plus simple mais je suis coincé sur un truc tout bête que je n'arrive pas à comprendre :
    Pourquoi ça, fonctionne (la grille apparaît correctement) :
    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
    from tkinter import*
    def affichage():
     
     
        fenetre = Tk()
        print("test")
        canevas=Canvas(fenetre)
        canevas.configure(width=700,height=600,bg='#0048B5')
        canevas.grid(row = 1,column = 1,padx = 20,pady = 20)
     
     
        for k in range(7):
            for l in range(6):
                canevas.create_oval(100*k+50-45,100*l+50-45,100*k+50+45,100*l+50+45,width=5,fill='white',outline='#018CD2')
     
     
    affichage()
    Et pas ça (la grille ne s'affiche pas) :
    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
    from tkinter import*
    def affichage():
     
     
        fenetre = Tk()
        print("test")
        canevas=Canvas(fenetre)
        canevas.configure(width=700,height=600,bg='#0048B5')
        canevas.grid(row = 1,column = 1,padx = 20,pady = 20)
     
     
        for k in range(7):
            for l in range(6):
                canevas.create_oval(100*k+50-45,100*l+50-45,100*k+50+45,100*l+50+45,width=5,fill='white',outline='#018CD2')
     
    def test():
        affichage()
    Il n'est pas possible que vous ayez regardé des tutos.
    C'est le "B", "A" "BA" des tutoriels.
    Je vous en ai parlé dans mon premier message.

    À lire absolument: G.Swinnen (pas à parcourir, ni à survoler, ni à regarder les images, non, à lire).

    Clodion
    PS: une fonction s'appelle.

Discussions similaires

  1. [Lecture de FichierXML] <--Gros problème
    Par waldo2188 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 18/03/2005, 17h15
  2. gros problème id
    Par Sékiltoyai dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/12/2004, 11h53
  3. Gros problème avec la facturation de Tiscali
    Par Harry dans le forum Dépannage et Assistance
    Réponses: 5
    Dernier message: 21/10/2004, 18h55
  4. Gros problème de session/cookies
    Par valfredr dans le forum XMLRAD
    Réponses: 18
    Dernier message: 03/06/2004, 09h21
  5. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10

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