Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeu du pendu sur Tkinter

Pb Pour récupérer la lettre que l'utilisateur a cliquer

    26 avril 2019 à 17:14:44

    Bonjour a tous,

    Pour le BAc en ISN, nous avons choisit de faire un mini jeux sous la forme de l'histoire dont vous etes le héros.

    Pour ma part, j'avais 2 mini-jeux a faire, une charade et un Pendu.

    Or je bloque sur mon second mini-jeux. Je n'arrive pas a récupérer la lettre que l'utilisateur clique pour "demander" une lettre.

    Voici mon code, pouvez vous m'aider s'il vous plaît ?Fenêtre du mini jeu

    # -*- coding: utf-8 -*-
    """
    Created on Thu Mar 28 14:31:40 2019
    
    @author: netono
    """
    
    from tkinter import *
    """from PIL import *"""
    
    tab=["a","l","b","n","i","e"]
    
    lettre= tab#liste a l b  n i e 
    
    
    def comparer_lettre(lettre, bouton_lettre):
        return lettre.lower() == réponse.lower()
    
    
    def valider_lettre():
        bouton_lettre=bouton.get()
        afficher = comparer_lettre(lettre, bouton_lettre)
        for w in range(0,6):
            if afficher :
                print (lettre)
            else :
                print ("X")
    
    
    #Fonction pour comparer la réponse de l'utilisateur à la vraie réponse
    def comparer(texte, réponse):
        return texte.lower() == réponse.lower()
    
    #Fonction pour afficher dans la console "juste" ou "faux"
    def valider():
        texte = Saisir_réponse.get()
        juste = comparer(texte, réponse)
        if juste:
            print ("Juste"+", "+"Niveau suivant")
        else:
            print ("Faux"+", "+"retentez votre chance")
    
    
    #Création de la fenetre
    fenetre= Tk()
    fenetre.geometry("600x400")
    fenetre.title("Mini_jeu_n°2.b: Le Pendu")
    
    #Photo 1
    photo = PhotoImage(file="albanie.gif")
    canvas = Canvas(fenetre,width=240, height=250)
    canvas.create_image(0, 0, anchor=NW, image=photo)
    canvas.pack()
    
    #Explication du mini jeu
    explication= Label(fenetre, text="Le but du jeu ici est de deviner ce qui correspond à l'image afficher \n Entrez votre réponse dans le champs de saisie ci-dessous et cliquer sur le bouton pour valider votre réponse \n")
    explication.pack()
    
    
    # Clavier Intéractif
    bouton = [0]*26
    for i in range(26):
        bouton[i] = Button(fenetre,text=chr(i+65),command= comparer_lettre)
        bouton[i].pack(side=LEFT)
    
    bouton_lettre=bouton.get()
    
    #Zone de saisie 
    Saisir_réponse = Entry(fenetre)
    Saisir_réponse.pack()
    
    #Le bouton
    bouton = Button(fenetre, text="Valider", command= valider)
    bouton.pack()
    
    #Entrer la réponse (=albanie) dans une variable
    texte=Saisir_réponse.get()
    réponse="albanie"
    
    fenetre.mainloop()
    

    Merci pour vos réponse,

    Kirïa

    • Partager sur Facebook
    • Partager sur Twitter
    Kiria
      26 avril 2019 à 17:22:45

      Le but serait qu'a la création de chaque bouton tu puisses filer le caractère du bouton donc chr(i+65) a ta fonction pour comparer je te laisse faire quelque recherche sur "lambda" qui pourraient t'aider.
      • Partager sur Facebook
      • Partager sur Twitter
        26 avril 2019 à 17:31:34

        RedTenZ a écrit:

        Le but serait qu'a la création de chaque bouton tu puisses filer le caractère du bouton donc chr(i+65) a ta fonction pour comparer je te laisse faire quelque recherche sur "lambda" qui pourraient t'aider.



        Je crois avoir compris ce qu'etais lambda mais je ne vois pas comment l'utiliser avec chr(i+65). Pouvez-vous m'éclairée?

        -
        Edité par NoémieNeto 26 avril 2019 à 17:57:58

        • Partager sur Facebook
        • Partager sur Twitter
        Kiria
          26 avril 2019 à 18:05:20

          le but ici c'est que tu vas pouvoir donner dans ta commande (pour chaque bouton) une valeur différente et la faire renvoyer la valeur que tu souhaites

          # -*- coding: utf-8 -*-
          """
          Created on Thu Mar 28 14:31:40 2019
           
          @author: netono
          """
           
          from tkinter import *
          """from PIL import *"""
           
          tab=["a","l","b","n","i","e"]
           
          lettre= tab#liste a l b  n i e
           
           
          def comparer_lettre(lettre):
              lettre = chr(lettre+65)
              print(lettre)
           
           
          def valider_lettre():
              bouton_lettre=bouton.get()
              afficher = comparer_lettre(lettre, bouton_lettre)
              for w in range(0,6):
                  if afficher :
                      print (lettre)
                  else :
                      print ("X")
           
           
          #Fonction pour comparer la réponse de l'utilisateur à la vraie réponse
          def comparer(texte, réponse):
              return texte.lower() == réponse.lower()
           
          #Fonction pour afficher dans la console "juste" ou "faux"
          def valider():
              texte = Saisir_réponse.get()
              juste = comparer(texte, réponse)
              if juste:
                  print ("Juste"+", "+"Niveau suivant")
              else:
                  print ("Faux"+", "+"retentez votre chance")
           
           
          #Création de la fenetre
          fenetre= Tk()
          fenetre.geometry("600x400")
          fenetre.title("Mini_jeu_n°2.b: Le Pendu")
           
          
          #Explication du mini jeu
          explication= Label(fenetre, text="Le but du jeu ici est de deviner ce qui correspond à l'image afficher \n Entrez votre réponse dans le champs de saisie ci-dessous et cliquer sur le bouton pour valider votre réponse \n")
          explication.pack()
           
           
          # Clavier Intéractif
          bouton = [0]*26
          for i in range(26):
              bouton[i] = Button(fenetre,text=chr(i+65),command=lambda i=i : comparer_lettre(i))
              bouton[i].pack(side=LEFT)
           
          bouton_lettre=bouton.get()
           
          #Zone de saisie
          Saisir_réponse = Entry(fenetre)
          Saisir_réponse.pack()
           
          #Le bouton
          bouton = Button(fenetre, text="Valider", command= valider)
          bouton.pack()
           
          #Entrer la réponse (=albanie) dans une variable
          texte=Saisir_réponse.get()
          réponse="albanie"
           
          fenetre.mainloop()
          

          Une fois compris je te laisse adapté le code comme tu en as envie

          -
          Edité par RedTenZ 26 avril 2019 à 18:09:09

          • Partager sur Facebook
          • Partager sur Twitter
            26 avril 2019 à 22:53:49

            RedTenZ a écrit:

            le but ici c'est que tu vas pouvoir donner dans ta commande (pour chaque bouton) une valeur différente et la faire renvoyer la valeur que tu souhaites

            # -*- coding: utf-8 -*-
            """
            Created on Thu Mar 28 14:31:40 2019
             
            @author: netono
            """
             
            from tkinter import *
            """from PIL import *"""
             
            tab=["a","l","b","n","i","e"]
             
            lettre= tab#liste a l b  n i e
             
             
            def comparer_lettre(lettre):
                lettre = chr(lettre+65)
                print(lettre)
             
             
            def valider_lettre():
                bouton_lettre=bouton.get()
                afficher = comparer_lettre(lettre, bouton_lettre)
                for w in range(0,6):
                    if afficher :
                        print (lettre)
                    else :
                        print ("X")
             
             
            #Fonction pour comparer la réponse de l'utilisateur à la vraie réponse
            def comparer(texte, réponse):
                return texte.lower() == réponse.lower()
             
            #Fonction pour afficher dans la console "juste" ou "faux"
            def valider():
                texte = Saisir_réponse.get()
                juste = comparer(texte, réponse)
                if juste:
                    print ("Juste"+", "+"Niveau suivant")
                else:
                    print ("Faux"+", "+"retentez votre chance")
             
             
            #Création de la fenetre
            fenetre= Tk()
            fenetre.geometry("600x400")
            fenetre.title("Mini_jeu_n°2.b: Le Pendu")
             
            
            #Explication du mini jeu
            explication= Label(fenetre, text="Le but du jeu ici est de deviner ce qui correspond à l'image afficher \n Entrez votre réponse dans le champs de saisie ci-dessous et cliquer sur le bouton pour valider votre réponse \n")
            explication.pack()
             
             
            # Clavier Intéractif
            bouton = [0]*26
            for i in range(26):
                bouton[i] = Button(fenetre,text=chr(i+65),command=lambda i=i : comparer_lettre(i))
                bouton[i].pack(side=LEFT)
             
            bouton_lettre=bouton.get()
             
            #Zone de saisie
            Saisir_réponse = Entry(fenetre)
            Saisir_réponse.pack()
             
            #Le bouton
            bouton = Button(fenetre, text="Valider", command= valider)
            bouton.pack()
             
            #Entrer la réponse (=albanie) dans une variable
            texte=Saisir_réponse.get()
            réponse="albanie"
             
            fenetre.mainloop()
            

            Une fois compris je te laisse adapté le code comme tu en as envie

            -
            Edité par RedTenZ il y a environ 4 heures

            J'ai compris, merci. Mais sauf que ici ça m'affiche toute les lettres et quand je demande de parcourir la liste ca me met qu'elle ne peut pas recevoir de get().

            Comment faire ?

            Est t'il possible de donner une valeur connue au lettre quand on les fait apparaître dans le but de pouvoir les comparer ?
            Je m'explique, imaginons que A=2 et que C=5 .  Quand l'utilisateur clique sur A, J'aimerais qu'une fonction ce lance, qu'il compare A (qui vaut 2) et le chiffre 2 puisque que on aura préalablement définie une variable qui vaut 2, 3 pour B ect...

            Est ce que cela vous semble possible ou non ?



            -
            Edité par NoémieNeto 26 avril 2019 à 23:00:15

            • Partager sur Facebook
            • Partager sur Twitter
            Kiria
              27 avril 2019 à 0:23:42


              RedTenZ a écrit:

              le but ici c'est que tu vas pouvoir donner dans ta commande (pour chaque bouton) une valeur différente et la faire renvoyer la valeur que tu souhaites

              def comparer_lettre(lettre):
                  lettre = chr(lettre+65)
                  print(lettre)
               
               
               
              # Clavier Intéractif
              bouton = [0]*26
              for i in range(26):
                  bouton[i] = Button(fenetre,text=chr(i+65),command=lambda i=i : comparer_lettre(i))
                  bouton[i].pack(side=LEFT)
               

              Oui, solution astucieuse. On peut aussi utiliser une fermeture.

               Une autre solution est la suivante : on binde le clic de souris sur un des boutons à une fonction de capture (ci-dessous afficher_lettre) et cette fonction récupère la lettre marquée sur le bouton par event.widget["text"] et l'affiche :

              def afficher_lettre(event):
                  print(event.widget['text'])
                
              bouton = [0]*26
              for i in range(26):
                  bouton[i] = Button(fenetre,text=chr(i+65))
                  bouton[i].pack(side=LEFT)
                  bouton[i].bind("<Button>", afficher_lettre)



              RedTenZ a écrit:

              bouton_lettre=bouton.get()
                

              à commenter, ne marche  pas, bouton est une liste.




              NoémieNeto a écrit:

              J'ai compris, merci. Mais sauf que ici ça m'affiche toute les lettres et quand je demande de parcourir la liste ca me met qu'elle ne peut pas recevoir de get().

              Comment faire ?


              Retire la ligne.

              Ensuite ça marche très bien, tu n'as plus qu'à comparer la lettre avec les lettres du mot inconnu.

              -
              Edité par PascalOrtiz 19 mai 2019 à 0:55:14

              • Partager sur Facebook
              • Partager sur Twitter
                27 avril 2019 à 2:39:57

                Oh j'ai repris le code trop rapidement c'est vrai ! Pardonnez moi !
                • Partager sur Facebook
                • Partager sur Twitter
                  27 avril 2019 à 10:58:56

                  Bonjour,

                  Une autre solution qui évite de multiples utilisations de la méthode bind, est de détecter l'instance comme indiqué ci-dessus, mais sur l'ensemble de l'interface graphique.

                  Cela ajoute un peu de complexité dans la détection de l'objet. Voici un exemple...

                  import tkinter as tk
                  
                  
                  def callback(event):
                      instance = event.widget
                      if isinstance(instance, tk.Button):
                          text = instance['text']
                          if len(text) == 1: # évite de détecter d'autres boutons
                              old_text = entry_test.get()
                              new_text = old_text + text
                              entry_test.delete(0, tk.END)
                              entry_test.insert(0, new_text)
                  
                  
                  root = tk.Tk()
                  root.bind('<Button-1>', callback)
                  button_test = tk.Button(root, text='A')
                  button_test.pack()
                  entry_test = tk.Entry(root)
                  entry_test.pack()
                  root.mainloop()
                  

                  Le choix dépendant surtout de la conception graphique pour la suite...

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                  La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                    27 avril 2019 à 11:19:52

                    # -*- coding: utf-8 -*-
                    """
                    Created on Sat Apr 27 11:06:54 2019
                    
                    @author: neto
                    """
                    
                    # -*- coding: utf-8 -*-
                    """
                    Created on Fri Apr 26 22:50:53 2019
                    
                    @author: neto
                    """
                    
                    # -*- coding: utf-8 -*-
                    """
                    Created on Thu Mar 28 14:31:40 2019
                      
                    @author: netono
                    """
                      
                    from tkinter import *
                    """from PIL import *"""
                      
                    tab=["A","L","B","N","I","E"]
                      
                    lettre= tab#liste a l b  n i e
                      
                      
                    def afficher_lettre(event):
                        print(event.widget['text'])
                       
                    
                    
                    def comparer_lettre(event):
                        return (event.widget['text']) == lettre
                    
                    def valider_lettre(event):
                        lettre= tab
                        correct = afficher_lettre(event)
                        if correct :
                            print ("le mots mystère contient cette lettre : " + event.widget["text"] )
                        else :
                            print ("le mots mystère ne contient pas cette lettre : " + event.widget["text"] )
                      
                    #Fonction pour comparer la réponse de l'utilisateur à la vraie réponse
                    def comparer(texte, réponse):
                        return texte.lower() == réponse.lower()
                      
                    #Fonction pour afficher dans la console "juste" ou "faux"
                    def valider():
                        texte = Saisir_réponse.get()
                        juste = comparer(texte, réponse)
                        if juste:
                            print ("Juste"+", "+"Niveau suivant")
                        else:
                            print ("Faux"+", "+"retentez votre chance")
                      
                      
                    #Création de la fenetre
                    fenetre= Tk()
                    fenetre.geometry("600x400")
                    fenetre.title("Mini_jeu_n°2.b: Le Pendu")
                      
                    
                    #Photo 1
                    photo = PhotoImage(file="albanie.gif")
                    canvas = Canvas(fenetre,width=240, height=250)
                    canvas.create_image(0, 0, anchor=NW, image=photo)
                    canvas.pack()
                    
                    #Explication du mini jeu
                    explication= Label(fenetre, text="Le but du jeu ici est de deviner ce qui correspond à l'image afficher \n Entrez votre réponse dans le champs de saisie ci-dessous et cliquer sur le bouton pour valider votre réponse \n")
                    explication.pack()
                      
                    
                    bouton = [0]*26
                    for i in range(26):
                        bouton[i] = Button(fenetre,text=chr(i+65))
                        bouton[i].pack(side=LEFT)
                        bouton[i].bind("<Button>", valider_lettre)
                    
                    #Zone de saisie
                    Saisir_réponse = Entry(fenetre)
                    Saisir_réponse.pack()
                      
                    #Le bouton
                    bouton = Button(fenetre, text="Valider", command= valider)
                    bouton.pack()
                      
                    #Entrer la réponse (=albanie) dans une variable
                    texte=Saisir_réponse.get()
                    réponse="albanie"
                      
                    fenetre.mainloop()
                    J'arrive maintenant a afficher une réponse mais elles son toutes incorect. La fonction ne semble pas les comparer. Pouvez vous m'aider ?
                    Aussi dans la console, quand on clique sur la lettre , le code affiche la lettre puis la phrase de réponse.
                    Est -il possible d'enlever l'affichage de la 1ere lettre ?

                    fred1599 a écrit:

                    Bonjour,

                    Une autre solution qui évite de multiples utilisations de la méthode bind, est de détecter l'instance comme indiqué ci-dessus, mais sur l'ensemble de l'interface graphique.

                    Cela ajoute un peu de complexité dans la détection de l'objet. Voici un exemple...

                    import tkinter as tk
                    
                    
                    def callback(event):
                        instance = event.widget
                        if isinstance(instance, tk.Button):
                            text = instance['text']
                            if len(text) == 1: # évite de détecter d'autres boutons
                                old_text = entry_test.get()
                                new_text = old_text + text
                                entry_test.delete(0, tk.END)
                                entry_test.insert(0, new_text)
                    
                    
                    root = tk.Tk()
                    root.bind('<Button-1>', callback)
                    button_test = tk.Button(root, text='A')
                    button_test.pack()
                    entry_test = tk.Entry(root)
                    entry_test.pack()
                    root.mainloop()
                    

                    Le choix dépendant surtout de la conception graphique pour la suite...

                    Merci de votre aide mais c'est trop complexe pour moi et je doit savoir lors de l'oral expliquer le code . Or le votre est trop compliqué pour moi ^^'

                    -
                    Edité par NoémieNeto 27 avril 2019 à 12:21:37

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Kiria
                      27 avril 2019 à 14:05:39

                      La fonction afficher_lettre t'a été donnée pour illustration mais tu dois l'adapter à tes besoins : on ne cherche pas à afficher la lettre mais à savoir si elle appartient au mot inconnu.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 avril 2019 à 17:32:59

                        PascalOrtiz a écrit:

                        La fonction afficher_lettre t'a été donnée pour illustration mais tu dois l'adapter à tes besoins : on ne cherche pas à afficher la lettre mais à savoir si elle appartient au mot inconnu.

                        J'ai modifié pour mais maintenant ça m'affiche que "appartient au mot mystère " ou "n'appartient pas"?.


                        Comment faire pour réussir a comparer ? Est ce que vous pouvez me le dire, je n'y arrive pas et je doit rendre pour demain au plus tard s'il vous plaît ?

                        -
                        Edité par NoémieNeto 27 avril 2019 à 17:34:26

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Kiria
                          27 avril 2019 à 17:49:34

                          NoémieNeto a écrit:

                          PascalOrtiz a écrit:

                          La fonction afficher_lettre t'a été donnée pour illustration mais tu dois l'adapter à tes besoins : on ne cherche pas à afficher la lettre mais à savoir si elle appartient au mot inconnu.

                          J'ai modifié pour mais maintenant ça m'affiche que "appartient au mot mystère " ou "n'appartient pas"?.

                          Tu as modifié comment ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 avril 2019 à 18:08:37

                            # -*- coding: utf-8 -*-
                            """
                            Created on Sat Apr 27 11:06:54 2019
                            
                            @author: neto
                            """
                            
                            from tkinter import *
                            """from PIL import *"""
                               
                            tab=["A","L","B","N","I","E"]
                               
                            lettre= tab#liste a l b  n i e
                               
                               
                            def afficher_lettre(event):
                                print(event.widget['text'])
                                
                             
                             
                            def comparer_lettre(event):
                                return (event.widget['text']) == lettre
                             
                            def valider_lettre(event):
                                tab=["A","L","B","N","I","E"]
                                correct = comparer_lettre(event)
                                if correct :
                                    print ("le mots mystère contient cette lettre : " + event.widget["text"] )
                                else :
                                    print ("le mots mystère ne contient pas cette lettre : " + event.widget["text"] )
                                
                            #Fonction pour comparer la réponse de l'utilisateur à la vraie réponse
                            def comparer(texte, réponse):
                                return texte.lower() == réponse.lower()
                              
                            #Fonction pour afficher dans la console "juste" ou "faux"
                            def valider():
                                texte = Saisir_réponse.get()
                                juste = comparer(texte, réponse)
                                if juste :
                                    print ("Juste"+", "+"Niveau suivant")
                                else:
                                    print ("Faux"+", "+"retentez votre chance")
                              
                              
                            #Création de la fenetre
                            fenetre= Tk()
                            fenetre.geometry("600x400")
                            fenetre.title("Mini_jeu_n°2.b: Le Pendu")
                              
                            
                            #Photo 1
                            photo = PhotoImage(file="albanie.gif")
                            canvas = Canvas(fenetre,width=240, height=250)
                            canvas.create_image(0, 0, anchor=NW, image=photo)
                            canvas.pack()
                            
                            #Explication du mini jeu
                            explication= Label(fenetre, text="Le but du jeu ici est de deviner ce qui correspond à l'image afficher \n Entrez votre réponse dans le champs de saisie ci-dessous et cliquer sur le bouton pour valider votre réponse \n")
                            explication.pack()
                              
                            #Clavier intéractif
                            bouton=[0]*26
                            for i in range (26):
                                bouton[i] = Button(fenetre,text=chr(i+65))
                                bouton[i].pack(side=LEFT)
                                bouton[i].bind("<Button>", valider_lettre)
                            
                            #Zone de saisie
                            Saisir_réponse = Entry(fenetre)
                            Saisir_réponse.pack()
                              
                            #Le bouton
                            bouton = Button(fenetre, text="Valider", command= valider)
                            bouton.pack()
                              
                            #Entrer la réponse (=albanie) dans une variable
                            texte=Saisir_réponse.get()
                            réponse="albanie"
                              
                            fenetre.mainloop()
                            Je me suis rendue compte que j'ai modifiée comparer_lettre et non afficher_lettre.
                            que manque t-il ?

                            -
                            Edité par NoémieNeto 27 avril 2019 à 18:17:28

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Kiria
                              27 avril 2019 à 19:18:23

                              Ligne 22 : tu compares une lettre et une liste !

                              Dans les grandes lignes :

                              - construit une liste lettres_ok en variable globale, au départ vide

                              - tout ce qui suit peut se faire dans ta fonction comparer_lettre 

                              - tu regarde si la lettre cliquée est dans la liste tab.

                              - Si oui et si elle n'est pas dans lettres_ok, tu la rajoutes à lettres_ok et tu affiche "lettre OK" et tu regardes si le nombre d'éléments dans liste_ok est égal au nombre d'élements dans tab et si oui, c'est que le mot est trouvé

                              Bon courage !

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Jeu du pendu sur Tkinter

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown