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 :

Jeu des carrés


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Jeu des carrés
    Bonjour, je suis nouveau sur le forum.
    J'essaye de développer un "jeu des carrés" (règles ci-dessous) sur tkinter. Seulement, j'ai appris l'intégralité de ce que j'ai utilisé dans mon code en autodidacte avec internet et je n'arrive pas à faire les dernières étapes seul.
    Le principe est que les joueurs (2 dans mon optique) colorient (un en vert, un en rouge par exemple), chacun leur tour, un des 4 bords d'un des carrés disponibles (25 dans mon cas), si les 4 côtés sont de la même couleur, le carré est colorié de cette couleur et le joueur gagne un point. La partie se termine lorsque plus aucun trait n'est coloriable.
    Je vous met mon code ci-dessous.
    J'arrive à obtenir la fenêtre, et rendre les bords de carrés cliquables mais mon problème arrive lorsque les joueurs doivent cliquer : je n'arrive pas à faire que les boutons (bords de carré) deviennent de la couleur du joueur, et donc non plus à changer la couleur du carré suivant la couleur des bords. J'ai supposé qu'il fallait utiliser une fonction command dans mes créations de boutons, mais je n'arrive pas à faire quoi que ce soit de correct.
    N'hésitez à me dire si je ne suis pas assez clair, j'apporterai les détails manquants.
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

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

    Citation Envoyé par SMONE Voir le message
    J'essaye de développer un "jeu des carrés" (règles ci-dessous) sur tkinter. Seulement, j'ai appris l'intégralité de ce que j'ai utilisé dans mon code en autodidacte avec internet et je n'arrive pas à faire les dernières étapes seul.
    Effectivement votre code ne ressemble pas à l'application tkinter type que le débutant code en ayant pris le temps d'ouvrir un tuto. tant pis pour vous.
    Ceci dit la solution à votre problème (récupérer le Button comme paramètre du callback) est décrite dans cet article de la FAQ.

    - 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
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre réponse, cependant je n'y vois pas de solution, ou je ne la comprend pas.
    Désolé si mon code n'a pas une forme conventionnelle, j'espère qu'il est tout de même lisible.
    Peut-être puis-je faire appel à une autre méthode que je ne connais pas ?
    Mon but est que la commande du bouton soit de faire changer l'image de celui-ci. Cependant la commande : Bt.command(Bt.image=nouvelleimage) n'existe pas (et doit même piquer les yeux pour ceux qui s'y connaissent), et malgré mes recherches je ne trouve pas de méthode pour que la commande d'un bouton puisse influencer sa propre image.
    Pouvez-vous m'aider plus explicitement ?
    Merci.

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

    Citation Envoyé par SMONE Voir le message
    Merci pour votre réponse, cependant je n'y vois pas de solution, ou je ne la comprend pas.
    si vous ne comprenez pas le problème, normal que vous ne compreniez pas la solution.

    Citation Envoyé par SMONE Voir le message
    Pouvez-vous m'aider plus explicitement ?
    Désolé mais il faudrait ré-écrire une bonne partie de votre code

    Prenez le temps d'apprendre en passant du temps avec un tuto. c'est toute l'aide que je peux vous donner (et si d'autres sont plus inspirés...il faudra attendre qu'ils se manifestent)

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

  5. #5
    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
    Salut,

    SMONE, ce que tu fais dans ton code est en gros.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import tkinter as tk
     
    def clic_bouton() :
        bouton['bg'] = 'red'
     
    root = tk.Tk()
     
    for i in range(5) :
        bouton = tk.Button(root, width=5, height=5, bg='white', command=clic_bouton)
        bouton.grid()
     
    root.mainloop()
    Alors que si tu regardes bien le code de la calculette sur la page que t'a fourni wiztricks, il faut transformer ce code en :

    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
    import tkinter as tk
     
    def clic_bouton(index) :
        def set_bouton_couleur():
            if boutons[index]['bg'] == 'white':
                couleur = 'blue'
            else :
                couleur = 'white'
            boutons[index]['bg'] = couleur
            boutons[index]['activebackground'] = couleur
        return set_bouton_couleur # Ici, pas de parenthèses
     
     
    root = tk.Tk()
     
    boutons = []
    for i in range(5) :
        bouton = tk.Button(root, width=5, height=5, bg='white', command=clic_bouton(i))
        bouton.grid()
        boutons.append(bouton)
     
    root.mainloop()
    Maintenant, si j'ai bien compris, chaque case de ta grille est composée de 5 éléments (4 boutons et un label par exemple), alors en sus de l'index de la case, il faut aussi fournir l'index du bouton dans la case, ce qu'on pourrait faire succinctement en :

    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
    import tkinter as tk
     
    def colorier_centre_case(index) :
        case = cases[index]
        for i in range(4):
            if case[i]['bg'] != 'blue' :
                return
        # label
        case[4]['bg'] = 'blue'
     
     
    def clic_bouton(index_case, index_element) :
        def colorier_bouton():
            bouton = cases[index_case][index_element]
            bouton.config(bg='blue', state=tk.DISABLED)
            colorier_centre_case(index_case)
        return colorier_bouton
     
     
    def creer_case(index, ligne, colonne) :
        frame = tk.Frame(root)
        frame.grid(row=ligne, column=colonne)
        haut = tk.Button(frame, command=clic_bouton(index, 0), width=5)
        bas = tk.Button(frame, command=clic_bouton(index, 1), width=5)
        gauche = tk.Button(frame, command=clic_bouton(index, 2), height=5)
        droite = tk.Button(frame, command=clic_bouton(index, 3), height=5)
        centre = tk.Label(frame, width=7, height=5, bg='white')
        haut.grid(row=0, column=0, columnspan=3)
        gauche.grid(row=1, column=0)
        centre.grid(row=1, column=1)
        droite.grid(row=1, column=2)
        bas.grid(row=2, column=0, columnspan=3)
        frame.columnconfigure(2, weight=1)
        return (haut, bas, gauche, droite, centre)
     
    root = tk.Tk()
     
    cases = []
    i = 0
    for ligne in range(3):
        for colonne in range(3):
            cases.append(creer_case(i, ligne, colonne))
            i += 1
     
    root.mainloop()
    grid ici est plus adapté que pack pour agencer des widgets sour forme de tableau.
    Mais si j'avais vraiment à faire ça, j'opterai pour un canvas plutôt qu'une pléthore de boutons.

    #j'ai recopié l'ossature d'un code que j'ai trouvé sur internet, je dois avouer ne pas savoir l'utilité de ce "class Interface"
    Faire ce genre de chose est à éviter
    Le temps ronge l'amour comme l'acide.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour bistouille,
    Merci pour ta réponse ça m'a énormément aidé.
    Cependant après des modifications pour essayer de créer un système de tour par tour, j'ai de nouvelles erreurs qui apparaissent. Je remet mon code en pièce jointe(je n'arrive pas à l'afficher comme tu as fait).
    Je n'arrive pas à localiser l'erreur, mais celle-ci fait que :
    -les boutons de sélection de joueur ne servent à rien et la couleur reste fixée à rouge
    -dès qu'un seul bord est coloré en rouge, le carré central se colore en bleu
    Encore désolé de ne pas réussir à m'y trouver moi-même, je ne m'y connais que très peu.
    Merci d'avance.
    Images attachées Images attachées   

  7. #7
    Membre confirmé

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

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Tes boutons pour gérer le tour des joueurs ne servent à rien, c'est à toi de t'arranger dans ton code de donner la main au joueur suivant après qu'un joueur ait joué.
    Pareil dans les boutons, aucun intérêt à passer une variable joueur en paramètre.

    Dans la fonction colorier_centre_case, la liste L que tu as créé n'a aucune utilité, une case centrale doit être coloriée uniquement si les 4 boutons frontaliers sont de la même couleur et est une couleur des joueurs.
    Donc récupérer la couleur du 1er bouton de la case, si pas parmi les couleurs joueurs, ne rien faire, sinon parcourir les 3 autres dans une boucle, si une a une couleur différente, ne rien faire, ne rien faire peut se résumer à faire un simple return.
    Si tous de même clouleur, alors colorier le centre de cette couleur, incrémenter le nombre de points du joueur ayant joué.

    Sinon, inutile de poster des images, c'est pas facile à lire, et cela utilise de la bande passante pour pas grand-chose.
    Poste directement ton code sur le forum en n'omettant pas d'utiliser les balises [code][/code] (bouton #).
    Le temps ronge l'amour comme l'acide.

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/01/2006, 11h48
  2. [algo et C] Jeu des dés en C
    Par bosz28 dans le forum C
    Réponses: 10
    Dernier message: 12/10/2005, 12h48
  3. [VB.NET] Débutant / Faire clignoter des carrés.
    Par djmcg dans le forum Windows Forms
    Réponses: 6
    Dernier message: 21/01/2005, 20h36
  4. [Débutant] dessiner des carrés
    Par Dark-Lab dans le forum 2D
    Réponses: 13
    Dernier message: 27/08/2004, 11h50

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