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 :

Tkinter probleme avec les bouton


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2021
    Messages : 11
    Par défaut Tkinter probleme avec les bouton
    Hey j'aurais beoin de l'aide de quelqu'un, j'ai raccourci mon programme pour vous faciliter la tache.
    Au début le rectangle a sa couleur d'arriere plan, quand je clique dessus il devient jaune mais si je reclique il reste jaune alors que j'aimerais qu'il devienne rouge...
    J'ai l'impression que mes IF de ma fonction 'couleurJoueur' sont ignorés..
    Si vous savez comment m'aider je vous remercie d'avance

    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
    from tkinter import *
    equipe = "R"
     
    def couleurJoueur(equipe):
        joueur.delete("all")
        if equipe == "J":
            equipe = "R"
            joueur.create_rectangle(0, 0, 50, 50, fill='red')
        if equipe == "R":
            equipe = "J"
            joueur.create_rectangle(0, 0, 50, 50, fill='yellow')
     
     
    fenetre =Tk()
    joueur = Canvas(fenetre, width=50, height=50, bg='#625957', highlightthickness=0)
     
    boutonJoueur = Button(fenetre, text="Changer de joueur", font=("Courrier", 20), bg='orange', fg='white', command=lambda : couleurJoueur(equipe))
    boutonJoueur.pack()
     
    joueur.pack()
    fenetre.mainloop()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    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 778
    Par défaut
    Salut,

    Dans couleurJoueur ajoutez un print(equipe), çà devrait vous donner des idées sur la cause du problème.

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

  3. #3
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2021
    Messages : 11
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Dans couleurJoueur ajoutez un print(equipe), çà devrait vous donner des idées sur la cause du problème.

    - W
    J'ai testé, il m'affiche effectivement que ma variable equipe = "J" a chaque fois que je clique sur le bouton..
    je ne comprend pas d'ou ca peut venir...

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    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 778
    Par défaut
    Citation Envoyé par remilami Voir le message
    je ne comprend pas d'ou ca peut venir...
    Du code que vous avez écrit.

    C'est pas compliqué: comment est appelée cette fonction: command=lambda : couleurJoueur(equipe).

    Ce équipe là est 'R' et n'a aucune raison de changer avec les appels successifs à la fonction. Et de toutes façons, appeler une fonction avec un paramètre donné, va produire le même résultat.

    Pour que son comportement change, il faut que la fonction accède à une mémoire externe (qui soit présente avant et après son exécution/activation).

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

  5. #5
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2021
    Messages : 11
    Par défaut
    Pour que son comportement change, il faut que la fonction accède à une mémoire externe (qui soit présente avant et après son exécution/activation).
    Ah oui effectivement j'ai compris ce qui n'allais pas merci
    Et ce que vous me dites me semble assez complexe je pense ne pas savoir le faire...
    En resumé je cherche simplement une facon de faire alterner les 2 équipes en cliquant sur le bouton, si vous avez une idée qui serait peut etre plus efficace que celle-ci je suis preneur...
    Merci de votre aide

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    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 778
    Par défaut
    Citation Envoyé par remilami Voir le message
    Et ce que vous me dites me semble assez complexe je pense ne pas savoir le faire...
    Si vous en êtes à programmer avec tkinter sans connaître les variables globales (comme vous ignorez sans doute la POO), çà ne va pas le faire.

    Retournez voir le chapitre sur les fonctions et la portée des variables de votre tuto/cours préféré car sans maîtriser çà vous allez juste patauger...


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

  7. #7
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2021
    Messages : 11
    Par défaut Probleme Puissance 4
    Citation Envoyé par wiztricks Voir le message
    Si vous en êtes à programmer avec tkinter sans connaître les variables globales (comme vous ignorez sans doute la POO), çà ne va pas le faire.

    Retournez voir le chapitre sur les fonctions et la portée des variables de votre tuto/cours préféré car sans maîtriser çà vous allez juste patauger...


    - W
    Ca y'est j'ai enfin réussi grâce a l'accès aux variables globales dans une fonction même si c'est déconseillé..
    Je propose ce code, c'est un puissance 4 avec l'affichage fonctionnel mais il me manque la fonction pour détecter quand un joueur a gagné...
    Je n'ai aucune idées pour cette fonction si vous avez une piste je veux bien
    Merci de votre aide

    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
    from tkinter import *
     
    jeton = {"R": 1, "J": 5}
    grilleDeJeu = [
        [0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0]
    ]
     
     
    def equipe(couleur):
        # Affiche la couleur de l'equipe selectionnée et attribut la variable EQUIPE
        global EQUIPE
        lumiereJaune = Canvas(lumiere, width=80, height=30, bg='#625957', highlightthickness=0)
        lumiereRouge = Canvas(lumiere, width=80, height=30, bg='#625957', highlightthickness=0)
        if couleur == "J":
            lumiereJaune.create_rectangle(0, 0, 80, 30, fill='red')
            lumiereRouge.create_rectangle(0, 0, 80, 30, fill='#625957')
            EQUIPE = "R"
        if couleur =="R":
            lumiereRouge.create_rectangle(0, 0, 80, 50, fill='yellow')
            lumiereJaune.create_rectangle(0, 0, 80, 50, fill='#625957')
            EQUIPE = "J"
        lumiereJaune.grid(column=0, row=0)
        lumiereRouge.grid(column=1, row=0)
     
     
    def ajouterJeton(colonne, couleur, jeton, grilleDeJeu):
        global EQUIPE
        hauteur = 100
        largeur = 150
        sortie = False
        # Fonction qui place le jeton dans la matrice
        jetonPlace = False
        for vertical in reversed(range(0, 6)):
            for horizontal in range(0, 7):
                nom = "nom" + str(vertical) + str(horizontal)
                nom = Canvas(boiteGrille, width=largeur, height=hauteur, bg='#272AC4', highlightthickness=0)
     
                if colonne == horizontal:
                    if 0 == grilleDeJeu[vertical][horizontal] and jetonPlace == False:
                        grilleDeJeu[vertical][horizontal] = jeton[couleur]
                        jetonPlace = True
                        sortie = True
                    if jetonPlace == False and grilleDeJeu[vertical][horizontal] != 0:
                        sortie = False
     
                if grilleDeJeu[vertical][horizontal] == 0:
                    nom.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='white', outline='black', width=3)
                    nom.grid(row=vertical, column=horizontal, sticky=N)
                if grilleDeJeu[vertical][horizontal] == 5:
                    nom.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='yellow', outline='black', width=3)
                    nom.grid(row=vertical, column=horizontal, sticky=N)
                if grilleDeJeu[vertical][horizontal] == 1:
                    nom.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='red', outline='black', width=3)
                    nom.grid(row=vertical, column=horizontal, sticky=N)
        equipe(EQUIPE)
        return sortie
     
     
    # Initialisation de la fenetre
    fenetre = Tk()
    fenetre.title("Puissance 4 Python")
    fenetre.geometry("1080x825")
    fenetre.minsize(480, 360)
    fenetre.config(background='#625957')
     
    titre = Label(fenetre, text="Bienvenue sur notre puissance 4 python !!", font=("Courrier", 30), bg='#625957', fg='white')
    titre.pack()
    # Bouton d'equipe
    lumiere = Frame(fenetre, bg ='#625957')
    equipe("J") # Equipe par default qui commence
    lumiere.pack()
     
     
    # Ajout de la boite contenant les boutons et les fleches
    boiteBouton = Frame(fenetre, bg='#625957')
    boiteGrille = Frame(fenetre, bg='#625957')
    hauteur = 50
    largeur = 150
     
    # Affichage de la grille vide
    for vertical in range(0, 6):
        for horizontal in range(0, 7):
            vide = Canvas(boiteGrille, width=150, height=100, bg='#272AC4', highlightthickness=0)
            vide.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='white', outline='black', width=3)
            vide.grid(row=vertical, column=horizontal, sticky=N)
    # Affichage des fleches et des boutons
    for i in range(1, 8):
        nomFleche = "fleche" + str(i)
        nomFleche = Canvas(boiteBouton, width=largeur, height=hauteur, bg='#625957', highlightthickness=0)
        nomFleche.create_line(150/2, 10, 150/2, 40, width=20, arrow='last', fill='silver')
        nomFleche.grid(row=1, column=0+i, sticky=N)
     
    bouton1 = Button(boiteBouton, text=" |O| ", font=("Courrier", 20), bg='orange', fg='white', command=lambda: ajouterJeton(0, EQUIPE, jeton, grilleDeJeu))
    bouton1.grid(row=0, column=1, sticky=S)
    bouton2 = Button(boiteBouton, text=" |O| ", font=("Courrier", 20), bg='orange', fg='white', command=lambda: ajouterJeton(1, EQUIPE, jeton, grilleDeJeu))
    bouton2.grid(row=0, column=2, sticky=S)
    bouton3 = Button(boiteBouton, text=" |O| ", font=("Courrier", 20), bg='orange', fg='white', command=lambda: ajouterJeton(2, EQUIPE, jeton, grilleDeJeu))
    bouton3.grid(row=0, column=3, sticky=S)
    bouton4 = Button(boiteBouton, text=" |O| ", font=("Courrier", 20), bg='orange', fg='white', command=lambda: ajouterJeton(3, EQUIPE, jeton, grilleDeJeu))
    bouton4.grid(row=0, column=4, sticky=S)
    bouton5 = Button(boiteBouton, text=" |O| ", font=("Courrier", 20), bg='orange', fg='white', command=lambda: ajouterJeton(4, EQUIPE, jeton, grilleDeJeu))
    bouton5.grid(row=0, column=5, sticky=S)
    bouton6 = Button(boiteBouton, text=" |O| ", font=("Courrier", 20), bg='orange', fg='white', command=lambda: ajouterJeton(5, EQUIPE, jeton, grilleDeJeu))
    bouton6.grid(row=0, column=6, sticky=S)
    bouton7 = Button(boiteBouton, text=" |O| ", font=("Courrier", 20), bg='orange', fg='white', command=lambda: ajouterJeton(6, EQUIPE, jeton, grilleDeJeu))
    bouton7.grid(row=0, column=7, sticky=S)
     
    boiteBouton.pack()
    boiteGrille.pack()
     
     
    fenetre.mainloop()

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    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 778
    Par défaut
    Salut,

    Citation Envoyé par remilami Voir le message
    Ca y'est j'ai enfin réussi grâce a l'accès aux variables globales dans une fonction même si c'est déconseillé..
    Le problème est que vous n'écrivez pas des fonctions mais des callbacks qui vont être appelés par tkinter en fonction des évènements qui leurs sont associées pour modifier l'état du programme.

    Et l'état du programme, c'est toujours des variables globales (qui existent au delà de la durée de vie de la fonction)... et le mot clef global pour modifier des objets non-mutables.

    Je propose ce code, c'est un puissance 4 avec l'affichage fonctionnel mais il me manque la fonction pour détecter quand un joueur a gagné...
    Je n'ai aucune idées pour cette fonction si vous avez une piste je veux bien
    Ce sont des opérations qui vont compter les pions de couleurs alignés sur le tableau. Juste galère à écrire mais bon exercice pour jouer avec les boucles de boucles.

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

  9. #9
    Membre éprouvé
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Par défaut
    Hello,

    Idéalement, on automatise tout ce qui est automatisable ; en particulier, évitez d'initialiser "manuellement" un tableau...
    Voici une méthode, qui permet de créer un tableau de 7 colonnes et 6 lignes (sans passer par numpy) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grilleDeJeu = [[0 for i in range(7)] for i in range (6)]
    De même, plutôt que de créer un à un chacun des boutons, vous pouvez utiliser une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(7) :
        Button(boiteBouton, text=" |O| ", font=("Courrier", 20), bg='orange', fg='white', command=lambda i=i:play(i, team, jeton, grilleDeJeu)).grid(row=0, column=i+1, sticky=S)
    (Notez que j'ai rajouté i=i après le lambda (je vous invite à essayer ce qu'il se passe si vous l'enlevez) et que j'ai remplacé la fonction par play()

    Pour répondre à votre première question (comment switcher automatiquement), il suffit de créer la fonction play() (ou jouer, mais j'ai pour habitude de tout écrire en anglais) qui indique au code ce que veut dire "jouer" : il faut ajouter un bouton + switcher

    J'ouvre une parenthèse, votre fonction equipe() fonctionne mais elle n'est pas très représentative de ce qui se passe. En effet, elle prend un argument (couleur) comme si le jeu "autorisait" que l'on choisisse qui est le suivant à jouer ; or ce n'est pas le cas. Soit le joueur qui vient de jouer est "R" et le suivant doit être "J", soit l'inverse. J'ai donc modifié votre fonction pour qu'elle ne prenne aucun argument (et modifié EQUIPE par team) :
    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
    def chooseTeam():
        # Affiche la couleur de l'equipe selectionnée et attribut la variable EQUIPE
        global team
        if team is None or team == 'R' : couleur = 'J'
        elif team == 'J' : couleur = 'R'
        lumiereJaune = Canvas(boiteJaune, width=50, height=30, bg='#625957', highlightthickness=0)
        lumiereRouge = Canvas(boiteRouge, width=50, height=30, bg='#625957', highlightthickness=0)
        if couleur == "J":
            lumiereJaune.create_rectangle(0, 0, 50, 30, fill='yellow')
            lumiereRouge.create_rectangle(0, 0, 50, 30, fill='#625957')
            team = "J"
        if couleur =="R":
            lumiereRouge.create_rectangle(0, 0, 50, 50, fill='red')
            lumiereJaune.create_rectangle(0, 0, 50, 50, fill='#625957')
            team = "R"
        lumiereJaune.grid(column=1, row=0)
        lumiereRouge.grid(column=1, row=0)
    Notez que j'ai initialisé team à None pour que le premier joueur (par défaut) soit le jaune.

    Voici le code global :
    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
    from tkinter import *
     
    jeton = {"R": 1, "J": 5}
    grilleDeJeu = [[0 for i in range(7)] for i in range (6)]
     
    def ajouterJeton(colonne, couleur, jeton, grilleDeJeu):
        hauteur = 100
        largeur = 150
        sortie = False
        # Fonction qui place le jeton dans la matrice
        jetonPlace = False
        for vertical in reversed(range(0, 6)):
            for horizontal in range(0, 7):
                nom = "nom" + str(vertical) + str(horizontal)
                nom = Canvas(boiteGrille, width=largeur, height=hauteur, bg='#272AC4', highlightthickness=0)
     
                if colonne == horizontal:
                    if 0 == grilleDeJeu[vertical][horizontal] and jetonPlace == False:
                        grilleDeJeu[vertical][horizontal] = jeton[couleur]
                        jetonPlace = True
                        sortie = True
                    if jetonPlace == False and grilleDeJeu[vertical][horizontal] != 0:
                        sortie = False
     
                if grilleDeJeu[vertical][horizontal] == 0:
                    nom.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='white', outline='black', width=3)
                    nom.grid(row=vertical, column=horizontal, sticky=N)
                if grilleDeJeu[vertical][horizontal] == 5:
                    nom.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='yellow', outline='black', width=3)
                    nom.grid(row=vertical, column=horizontal, sticky=N)
                if grilleDeJeu[vertical][horizontal] == 1:
                    nom.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='red', outline='black', width=3)
                    nom.grid(row=vertical, column=horizontal, sticky=N)
        return sortie
     
     
    def chooseTeam():
        # Affiche la couleur de l'equipe selectionnée et attribut la variable EQUIPE
        global team
        if team is None or team == 'R' : couleur = 'J'
        elif team == 'J' : couleur = 'R'
        lumiereJaune = Canvas(boiteJaune, width=50, height=30, bg='#625957', highlightthickness=0)
        lumiereRouge = Canvas(boiteRouge, width=50, height=30, bg='#625957', highlightthickness=0)
        if couleur == "J":
            lumiereJaune.create_rectangle(0, 0, 50, 30, fill='yellow')
            lumiereRouge.create_rectangle(0, 0, 50, 30, fill='#625957')
            team = "J"
        if couleur =="R":
            lumiereRouge.create_rectangle(0, 0, 50, 50, fill='red')
            lumiereJaune.create_rectangle(0, 0, 50, 50, fill='#625957')
            team = "R"
        lumiereJaune.grid(column=1, row=0)
        lumiereRouge.grid(column=1, row=0)
     
     
    # Initialisation de la fenetre
    fenetre = Tk()
    fenetre.title("Puissance 4 Python")
    fenetre.geometry("1080x720")
    fenetre.minsize(480, 360)
    fenetre.config(background='#625957')
     
    team = None
    titre = Label(fenetre, text="Bienvenue sur notre puissance 4 python !!", font=("Courrier", 30), bg='#625957', fg='white')
    titre.pack()
    # Bouton d'equipe
    boiteJaune = Frame(fenetre, bg ='#625957')
    boiteRouge = Frame(fenetre, bg ='#625957')
    chooseTeam() # Equipe par default qui commence
    rdioOne = Radiobutton(boiteJaune, text='Jaune', width=20, height=1, variable="equipe", value=1, command=lambda: chooseTeam())
    rdioOne.select() # Equipe par default qui commence
    rdioTwo = Radiobutton(boiteRouge, text='Rouge', width=20, height=1, variable="equipe", value=2, command=lambda: chooseTeam())
    rdioOne.grid(column=0, row=0)
    rdioTwo.grid(column=0, row=0)
    boiteJaune.pack()
    boiteRouge.pack()
     
    # Ajout de la boite contenant les boutons et les fleches
    boiteBouton = Frame(fenetre, bg='#625957')
    boiteGrille = Frame(fenetre, bg='#625957')
    hauteur = 50
    largeur = 150
     
    # Affichage de la grille vide
    for vertical in range(0, 6):
        for horizontal in range(0, 7):
            vide = Canvas(boiteGrille, width=150, height=100, bg='#272AC4', highlightthickness=0)
            vide.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='white', outline='black', width=3)
            vide.grid(row=vertical, column=horizontal, sticky=N)
    # Affichage des fleches et des boutons
    for i in range(1, 8):
        nomFleche = "fleche" + str(i)
        nomFleche = Canvas(boiteBouton, width=largeur, height=hauteur, bg='#625957', highlightthickness=0)
        nomFleche.create_line(150/2, 10, 150/2, 40, width=20, arrow='last', fill='silver')
        nomFleche.grid(row=1, column=0+i, sticky=N)
     
    for i in range(7) :
        Button(boiteBouton, text=" |O| ", font=("Courrier", 20), bg='orange', fg='white', command=lambda i=i:play(i, team, jeton, grilleDeJeu)).grid(row=0, column=i+1, sticky=S)
     
    def play(i, EQUIPE, jeton, grilleDeJeu) :
        ajouterJeton(i, EQUIPE, jeton, grilleDeJeu)
        chooseTeam()
     
    boiteBouton.pack()
    boiteGrille.pack()
     
     
    fenetre.mainloop()
    Pour votre deuxième question, quelques indices :
    - l'analyse doit se faire à chaque tour, donc potentiellement implémenter une fonction check_if_winner() à inclure dans la fonction play()
    - si vainqueur il y a, c'est grâce au dernier jeton ; donc pas besoin d'évaluer toute la grille, on peut analyser de proche en proche
    - pas besoin d'analyser si le tour de jeu est inférieur à 4

    Je vous laisse le soin d'implémenter le reste

  10. #10
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2021
    Messages : 11
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Le problème est que vous n'écrivez pas des fonctions mais des callbacks qui vont être appelés par tkinter en fonction des évènements qui leurs sont associées pour modifier l'état du programme.

    Et l'état du programme, c'est toujours des variables globales (qui existent au delà de la durée de vie de la fonction)... et le mot clef global pour modifier des objets non-mutables.



    Ce sont des opérations qui vont compter les pions de couleurs alignés sur le tableau. Juste galère à écrire mais bon exercice pour jouer avec les boucles de boucles.

    - W
    Alors je vais m'amuser avec des opérations
    Merci de ton aide

  11. #11
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2021
    Messages : 11
    Par défaut
    Pour votre deuxième question, quelques indices :
    - l'analyse doit se faire à chaque tour, donc potentiellement implémenter une fonction check_if_winner() à inclure dans la fonction play()
    - si vainqueur il y a, c'est grâce au dernier jeton ; donc pas besoin d'évaluer toute la grille, on peut analyser de proche en proche
    - pas besoin d'analyser si le tour de jeu est inférieur à 4
    Effectivement avec une nouvelle fonction play c'est assez efficace
    Merci beaucoup pour ton aide tres détailllé, c'est rare qu'on m'explique si bien

    Je vais chercher un peu avec les pistes que tu m'a donné je reviendrais te donner des nouvelles
    Encore merci a toi

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    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 778
    Par défaut
    Salut,

    Vous programmez comme vous pouvez mais il est dommage de ne pas utiliser un seul Canvas pour y placer vos jetons.
    Jetons qui pourraient être des "disques" qui changent de couleur.

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

  13. #13
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2021
    Messages : 11
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Vous programmez comme vous pouvez mais il est dommage de ne pas utiliser un seul Canvas pour y placer vos jetons.
    Jetons qui pourraient être des "disques" qui changent de couleur.

    - W
    Je note ce vous me faites remarquer, quand le puissance 4 sera fonctionnel je l'améliorerais avec vos remarques, c'est vrais que mon système de carré déjà pré coloré n'est pas l'idéal...

  14. #14
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2021
    Messages : 11
    Par défaut
    Bon je reviens aux nouvelles, j'ai bien avancé, une légère chose me pose problème encore :
    Avec la fonction 'victoire', je détecte bien quand c'est aligné verticalement et horizontalement.
    En diagonale, le programme fonctionne seulement quand c'est une diagonale de Haut en Bas (voir diagonale Jaune).
    Lorsque j'ai une diagonale de Bas en Haut (voir diagonale rouge) il ne détecte pas que c'est gagné...

    A votre avis d'où ca vient ?

    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
    def victoire(vertical, horizontal, grille):
        print(vertical, horizontal, grille)
        # Lignes
        for x in range(4):
            if grille[vertical][x] == grille[vertical][x + 1] == grille[vertical][x + 2] == grille[vertical][x + 3] == 1:
                print ("L'équipe rouge gagne cette manche")
            if grille[vertical][x] == grille[vertical][x + 1] == grille[vertical][x + 2] == grille[vertical][x + 3] == 5:
                print("L'équipe Jaune gagne cette manche")
        # Colonnes
        for y in range(3):
            if grille[y][horizontal] == grille[y+1][horizontal] == grille[y+2][horizontal] == grille[y+3][horizontal] == 1:
                print("L'équipe rouge gagne cette manche")
            if grille[y][horizontal] == grille[y+1][horizontal] == grille[y+2][horizontal] == grille[y+3][horizontal] == 5:
                print("L'équipe Jaune gagne cette manche")
        # Diagonales
        for x in range(3):
            for y in range(4):
                if grille[x][y] == grille[x+1][y+1] == grille[x+2][y+2] == grille[x+3][y+3] == grille[vertical][horizontal]:
                    print("Diagonale1")
    Nom : puissance4.PNG
Affichages : 331
Taille : 64,1 Ko

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    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 778
    Par défaut
    Citation Envoyé par remilami Voir le message
    A votre avis d'où ca vient ?
    Hey? Il n'y a même pas le code qui essaie de...
    Et ce n'est pas une question "python", juste des calculs que vous pouvez poser sur une feuille de papier...
    Si (i, j) est le point de départ, pour descendre "en diagonale" sur que çà va être i+1, j+1 mais la diagonale "montante", il va y avoir des soustractions.

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

  16. #16
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2021
    Messages : 11
    Par défaut
    Hey? Il n'y a même pas le code qui essaie de...
    Si j'ai essayé ca :
    Mais au niveau des diagonales j'ai beau le tourner dans tous les sens il ne me prend pas les diagonales montantes

    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
    def victoire(vertical, horizontal, grille):
        print(vertical, horizontal, grille)
        # Lignes
        for x in range(4):
            if grille[vertical][x] == grille[vertical][x + 1] == grille[vertical][x + 2] == grille[vertical][x + 3] == 1:
                print ("L'équipe rouge gagne cette manche")
            if grille[vertical][x] == grille[vertical][x + 1] == grille[vertical][x + 2] == grille[vertical][x + 3] == 5:
                print("L'équipe Jaune gagne cette manche")
        # Colonnes
        for y in range(3):
            if grille[y][horizontal] == grille[y+1][horizontal] == grille[y+2][horizontal] == grille[y+3][horizontal] == 1:
                print("L'équipe rouge gagne cette manche")
            if grille[y][horizontal] == grille[y+1][horizontal] == grille[y+2][horizontal] == grille[y+3][horizontal] == 5:
                print("L'équipe Jaune gagne cette manche")
        # Diagonales
        for x in range(3):
            for y in range(4):
                if grille[x][y] == grille[x+1][y+1] == grille[x+2][y+2] == grille[x+3][y+3] == grille[vertical][horizontal]:
                    print("Diagonale1")
        for x in reversed(range(3)):
            print(x)
            for y in range(4):
                print(y)
                if grille[x][y] == grille[x-1][y-1] == grille[x-2][y-2] == grille[x-3][y-3] == grille[vertical][horizontal]:
                    print("Diagonale2")

  17. #17
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Il y a également un problème avec les jaunes : si on essaie de remplir la ligne du bas, cela ne se remplit pas.

  18. #18
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2021
    Messages : 11
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Il y a également un problème avec les jaunes : si on essaie de remplir la ligne du bas, cela ne se remplit pas.
    Je ne suis pas sur de bien comprendre mais voici le code complet :
    Il me semble qu'il fonctionne pour les jaunes


    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
    from tkinter import *
     
    jeton = {"R": 1, "J": 5}
    grilleDeJeu = [[0 for i in range(7)] for i in range (6)]
     
     
    def equipe(couleur):
        # Affiche la couleur de l'equipe selectionnée et attribut la variable EQUIPE
        global EQUIPE
        lumiereJaune = Canvas(lumiere, width=80, height=30, bg='#625957', highlightthickness=0)
        lumiereRouge = Canvas(lumiere, width=80, height=30, bg='#625957', highlightthickness=0)
        if couleur == "J":
            lumiereJaune.create_rectangle(0, 0, 80, 30, fill='red')
            lumiereRouge.create_rectangle(0, 0, 80, 30, fill='#625957')
            EQUIPE = "R"
        if couleur =="R":
            lumiereRouge.create_rectangle(0, 0, 80, 50, fill='yellow')
            lumiereJaune.create_rectangle(0, 0, 80, 50, fill='#625957')
            EQUIPE = "J"
        lumiereJaune.grid(column=0, row=0, pady=10)
        lumiereRouge.grid(column=1, row=0, pady=10)
     
     
    def victoire(vertical, horizontal, grille):
        print(vertical, horizontal, grille)
        # Lignes
        for x in range(4):
            if grille[vertical][x] == grille[vertical][x + 1] == grille[vertical][x + 2] == grille[vertical][x + 3] == 1:
                print ("L'équipe rouge gagne cette manche")
            if grille[vertical][x] == grille[vertical][x + 1] == grille[vertical][x + 2] == grille[vertical][x + 3] == 5:
                print("L'équipe Jaune gagne cette manche")
        # Colonnes
        for y in range(3):
            if grille[y][horizontal] == grille[y+1][horizontal] == grille[y+2][horizontal] == grille[y+3][horizontal] == 1:
                print("L'équipe rouge gagne cette manche")
            if grille[y][horizontal] == grille[y+1][horizontal] == grille[y+2][horizontal] == grille[y+3][horizontal] == 5:
                print("L'équipe Jaune gagne cette manche")
        # Diagonales
        for x in range(3):
            for y in range(4):
                if grille[x][y] == grille[x+1][y+1] == grille[x+2][y+2] == grille[x+3][y+3] == grille[vertical][horizontal]:
                    print("Diagonale1")
        for x in range(3):
            for y in range(4):
                if grille[x][y] == grille[x-1][y+1] == grille[x-2][y+2] == grille[x-3][y+3] == grille[vertical][horizontal]:
                    print("Diagonale2")
     
     
    def ajouterJeton(colonne, couleur, jeton, grilleDeJeu):
        global EQUIPE
        hauteur = 100
        largeur = 150
        sortie = False
        # Fonction qui place le jeton dans la matrice
        jetonPlace = False
        for vertical in reversed(range(0, 6)):
            for horizontal in range(0, 7):
                nom = "nom" + str(vertical) + str(horizontal)
                nom = Canvas(boiteGrille, width=largeur, height=hauteur, bg='#272AC4', highlightthickness=0)
     
                if colonne == horizontal:
                    if 0 == grilleDeJeu[vertical][horizontal] and jetonPlace == False:
                        grilleDeJeu[vertical][horizontal] = jeton[couleur]
                        jetonPlace = True
                        sortie = True
                        # Test s il y a un gagnant
                        victoire(vertical, horizontal, grilleDeJeu)
                    if jetonPlace == False and grilleDeJeu[vertical][horizontal] != 0:
                        sortie = False
     
                if grilleDeJeu[vertical][horizontal] == 0:
                    nom.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='white', outline='black', width=3)
                    nom.grid(row=vertical, column=horizontal, sticky=N)
                if grilleDeJeu[vertical][horizontal] == 5:
                    nom.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='yellow', outline='black', width=3)
                    nom.grid(row=vertical, column=horizontal, sticky=N)
                if grilleDeJeu[vertical][horizontal] == 1:
                    nom.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='red', outline='black', width=3)
                    nom.grid(row=vertical, column=horizontal, sticky=N)
     
        # Passe au joueur suivant
        equipe(EQUIPE)
        return sortie
     
     
    # Initialisation de la fenetre
    fenetre = Tk()
    fenetre.title("Puissance 4 Python")
    fenetre.geometry("1080x825")
    fenetre.minsize(480, 360)
    fenetre.config(background='#625957')
     
    titre = Label(fenetre, text="Bienvenue sur notre puissance 4 python !!", font=("Courrier", 30), bg='#625957', fg='white')
    titre.pack()
    # Bouton d'equipe
    lumiere = Frame(fenetre, bg ='#625957')
    equipe("J") # Equipe par default qui commence
    lumiere.pack()
     
     
    # Ajout de la boite contenant les boutons et les fleches
    boiteBouton = Frame(fenetre, bg='#625957')
    boiteGrille = Frame(fenetre, bg='#625957')
    hauteur = 50
    largeur = 150
     
    # Affichage de la grille vide
    for vertical in range(0, 6):
        for horizontal in range(0, 7):
            vide = Canvas(boiteGrille, width=150, height=100, bg='#272AC4', highlightthickness=0)
            vide.create_oval(150 / 2 - 35, 15, 150 / 2 + 35, 85, fill='white', outline='black', width=3)
            vide.grid(row=vertical, column=horizontal, sticky=N)
    # Affichage des fleches et des boutons
    for i in range(1, 8):
        nomFleche = "fleche" + str(i)
        nomFleche = Canvas(boiteBouton, width=largeur, height=hauteur, bg='#625957', highlightthickness=0)
        nomFleche.create_line(150/2, 10, 150/2, 40, width=20, arrow='last', fill='silver')
        nomFleche.grid(row=1, column=0+i, sticky=N)
     
    for i in range(7) :
        Button(boiteBouton, text=" |O| ", font=("Courrier", 20), bg='orange', fg='white', command=lambda i=i: ajouterJeton(i, EQUIPE, jeton, grilleDeJeu)).grid(row=0, column=i+1, sticky=S)
     
    boiteBouton.pack()
    boiteGrille.pack()
     
     
    fenetre.mainloop()

  19. #19
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Ok, il y avait un bug avec le premier programme. C'est bon ici.

  20. #20
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    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 778
    Par défaut
    Citation Envoyé par remilami Voir le message
    Mais au niveau des diagonales j'ai beau le tourner dans tous les sens il ne me prend pas les diagonales montantes
    Personnellement, je ne comprends pas ce que vous essayez.

    Prenez une feuille de papier et essayez de visualiser les différents cas possibles.

    Vous devriez constater que la diagonale (et les lignes droites) peut être complétée par les extrémités ou en complétant "à l'intérieur", qu'il y a des bords,...
    A une position (i, j) donnée, il y a 8 directions possibles... mais comme on compte les pions alignés de la même couleur que celui en (i, j), il faut parcourir 4 directions et les directions opposées.

    Ce qui suppose écrire une fonction qui retourne le nombre de pions alignés autour de (i, j) pour une direction donnée (et la direction opposée).
    Fonction à appeler pour chacune des 4 directions... histoire de voir si une dépasse une certaine valeur.

    Si çà vous paraît trop compliqué, cherchez sur Internet (il y a certainement certainement des codes pour vous inspirer).

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/05/2007, 16h19
  2. Probleme avec les boutons d'options independants
    Par Vercingetorix dans le forum Access
    Réponses: 2
    Dernier message: 18/06/2006, 07h48
  3. [MFC] Probleme avec les bouton et les CEdit
    Par ksoft dans le forum MFC
    Réponses: 4
    Dernier message: 12/05/2006, 14h03
  4. Probleme avec les boutons radio
    Par aproust dans le forum Linux
    Réponses: 3
    Dernier message: 11/05/2006, 08h05
  5. probleme avec les radio bouton
    Par zola dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 08/06/2005, 09h52

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