Partage
  • Partager sur Facebook
  • Partager sur Twitter

supprimer des label avec une fonction (jeu + ou -)

    28 novembre 2021 à 21:12:13

    Bonjour je viens vers vous car je n'arrive pas à supprimer les labels créent qui contiennent les nombres rentré lorsque l'utilisateur va faire ses entrée dans l'Entry (je n'ais pas encore fait tout le code comme je bloque sur le fait de tout effacer sauf les nom des colonnes donc voici ce que j'ai déjà fait :

    from tkinter import*
    from random import*
    def reset():
        for j in range(1, len(history.winfo_children())):
            exec("new"+str(j)+".destroy")
        niveau1.config(state=NORMAL)
        niveau2.config(state=NORMAL)
        niveau3.config(state=NORMAL)
        play.config(state=DISABLED, command=lambda:game(lvl))
        
    
    def game(a):
        if(number.get() != ""):
            global i, randNumber, trycount
            trycount=trycount-1
            entry=number.get()
            number.delete(0,len(entry))
            entry=int(entry)
            if a==1:
                if entry==randNumber:
                    exec("global new"+str(i))
                    exec("new"+str(i)+"=Label(history, text='Bravo', bd=2, relief=SOLID, width=16)")
                    exec("new"+str(i)+".grid(column=2, row="+str(i)+")")
                    play.config(command=reset, text="Recommencer")
                elif entry>randNumber:
                    exec("global new"+str(i))
                    exec("new"+str(i)+"=Label(history, text='Trop grand', bd=2, relief=SOLID, width=16)")
                    exec("new"+str(i)+".grid(column=2, row="+str(i)+")")
                    i=i+1
                    exec("global new"+str(i))
                    exec("new"+str(i)+"=Label(history, text="+str(entry)+", bd=2, relief=SOLID, width=7)")
                    exec("new"+str(i)+".grid(column=1, row="+str(i-1)+")")
                    i=i+1
                    exec("global new"+str(i))
                    exec("new"+str(i)+"=Label(history, text="+str(15-trycount)+", bd=2, relief=SOLID, width=7)")
                    exec("new"+str(i)+".grid(column=0, row="+str(i-2)+")")
                elif entry<randNumber:
                    exec("global new"+str(i))
                    exec("new"+str(i)+"=Label(history, text='Trop petit', bd=2, relief=SOLID, width=16)")
                    exec("new"+str(i)+".grid(column=2, row="+str(i)+")")
                    i=i+1
                    exec("global new"+str(i))
                    exec("new"+str(i)+"=Label(history, text="+str(entry)+", bd=2, relief=SOLID, width=7)")
                    exec("new"+str(i)+".grid(column=1, row="+str(i-1)+")")
                    i=i+1
                    exec("global new"+str(i))
                    exec("new"+str(i)+"=Label(history, text="+str(15-trycount)+", bd=2, relief=SOLID, width=7)")
                    exec("new"+str(i)+".grid(column=0, row="+str(i-2)+")")
            if trycount==0:
                exec("global new"+str(i))
                exec("new"+str(i)+"=Label(history, text='Perdu', bd=2, relief=SOLID)")
                exec("new"+str(i)+".grid(column=0, row="+str(i)+", columnspan=3, sticky='nesw')")
                play.config(command=reset, text="Recommencer")
            i=i+1
    
    
    def begin(a):
        global lvl, trycount, randNumber
        if a==1:
            txt.config(text="Niveau 1 : Vous avez 15 coups\nProposez un nombre entre 1 et 1000")
            lvl=1
            trycount=15
            randNumber=randint(1, 1000)
            print(randNumber)
        elif a==2:
            txt.config(text="Niveau 2 : Vous avez 10 coups\nProposez un nombre entre 1 et 1000")
            lvl=2
            trycount=10
            randNumber=randint(1, 1000)
        else:
            txt.config(text="Niveau 3 : Vous avez 15 coups\nProposez un nombre entre 1 et 10 000")
            lvl=3
            trycount=15
            randNumber=randint(1, 10000)
        play.config(state=NORMAL, text="Jouer")
        niveau1.config(state=DISABLED)
        niveau2.config(state=DISABLED)
        niveau3.config(state=DISABLED)
    
    i=1
    fen=Tk()
    fen.title("Jeu du plus ou moins")
    
    
    home=Frame(fen,bd=2, pady=30)
    bvn=Label(home, text="Bienvenue dans le jeu du plus ou moins\nMerci de bien vouloir choisir votre niveau de jeu\n\
    Niveau 1 : nombre aléatoire entre 1 et 1000 avec 15 essais maximum\n\
    Niveau 2 : nombre aléatoire entre 1 et 1000 avec 10 essais maximum\n\
    Niveau 3 : nombre aléatoire entre 1 et 10 000 avec 15 essais maximum")
    bvn.grid(column=0, row=0, columnspan=3)
    niveau1=Button(home, text="Niveau 1", command=lambda:begin(1))
    niveau1.grid(column=0, row=1)
    niveau2=Button(home, text="Niveau 2", command=lambda:begin(2))
    niveau2.grid(column=1, row=1)
    niveau3=Button(home, text="Niveau 3", command=lambda:begin(3))
    niveau3.grid(column=2, row=1)
    home.grid(row=0,column=0,columnspan=3)
    
    main=Frame(fen, bd=2)
    txt=Label(main)
    txt.grid(column=0, row=0, columnspan=2)
    number=Entry(main, width=4, font=("Courier", 30))
    number.grid(column=0, row=1, columnspan=2)
    play=Button(main, text="Jouer", state=DISABLED, command=lambda:game(lvl))
    play.grid(column=0, row=2, sticky="e")
    quitt=Button(main, text="Quitter", command=fen.destroy)
    quitt.grid(column=1, row=2, sticky="w")
    main.grid(row=1, column=0)
    
    history=Frame(fen, bd=2)
    essaiColumn=Label(history, text="Essai", bd=2, relief=SOLID, width=7)
    essaiColumn.grid(column=0, row=0)
    nombreColumn=Label(history, text="Nombre", bd=2, relief=SOLID, width=7)
    nombreColumn.grid(column=1, row=0)
    positionColumn=Label(history, text="Trop petit/trop grand", bd=2, relief=SOLID, width=16)
    positionColumn.grid(column=2, row=0)
    history.grid(row=1, column=1)
    
    fen.mainloop()

    Aidez moi sur la fonction reset() svp, je n'arrive pas à la faire fonctionner

    -
    Edité par PaulCheveau 29 novembre 2021 à 9:10:34

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      28 novembre 2021 à 21:27:54

      Salut !

      Pourquoi tu veux les supprimer ?

      Tu préfèrerais pas remplacer le texte ?

      label.config(text="Trop petit")



      -
      Edité par Anonyme 28 novembre 2021 à 21:31:09

      • Partager sur Facebook
      • Partager sur Twitter
        28 novembre 2021 à 23:35:36

        ErispoeLeNarvalo a écrit:

        Salut !

        Pourquoi tu veux les supprimer ?

        Tu préfèrerais pas remplacer le texte ?

        label.config(text="Trop petit")

        -
        Edité par ErispoeLeNarvalo il y a environ 1 heure


        Non car du coup la fonction reset est utilisée lorsque l'on a finit le niveau, et que le bouton jouer se transforme en recommencer et que du coup la partie de l'historique se supprime
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          29 novembre 2021 à 9:13:40

          ErispoeLeNarvalo a écrit:

          label.destroy()


          Sauf que du coup non ça fonctionne pas, j'ai essayer d'initialiser les nom des Labels avec les lignes :

          exec("global new"+str(i))
          exec("new"+str(i)+"=Label(history, text='Bravo', bd=2, relief=SOLID, width=16)")
          exec("new"+str(i)+".grid(column=2, row="+str(i)+")")

          et les lignes la pour les supprimer :

          for j in range(1, len(history.winfo_children())):
              exec("new"+str(j)+".destroy")

          sauf que ça ne fonctionne pas je ne sait pas pourquoi

          • Partager sur Facebook
          • Partager sur Twitter
            29 novembre 2021 à 9:17:57

            PaulCheveau a écrit:

            sauf que ça ne fonctionne pas je ne sait pas pourquoi

            A cause de la portée des variables créées par défaut avec exec

            Mais c'est de la programmation avancée Python, avant on apprend à utiliser des listes d'objets qui sont suffisants ici

            -
            Edité par mps 29 novembre 2021 à 9:20:47

            • Partager sur Facebook
            • Partager sur Twitter
              29 novembre 2021 à 9:27:12

              mps a écrit:

              PaulCheveau a écrit:

              sauf que ça ne fonctionne pas je ne sait pas pourquoi

              A cause de la portée des variables créées par défaut avec exec

              Mais c'est de la programmation avancée Python, avant on apprend à utiliser des listes d'objets qui sont suffisants ici

              Donc comment je pourrais faire ?

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                29 novembre 2021 à 10:07:05

                import tkinter
                
                def change_text(evt):
                    if ent.get() == '5':
                        lbl.config(text="Aurevoir")
                        root.after(2000, lbl.destroy)
                    
                
                root = tkinter.Tk()
                lbl = tkinter.Label(root, text="Test")
                lbl.pack()
                ent = tkinter.Entry(root)
                ent.pack()
                ent.bind("<Return>", change_text)
                root.mainloop()
                
                Un programme basique pour t'aider.
                • Partager sur Facebook
                • Partager sur Twitter
                  29 novembre 2021 à 10:33:57

                  ErispoeLeNarvalo a écrit:

                  import tkinter
                  
                  def change_text(evt):
                      if ent.get() == '5':
                          lbl.config(text="Aurevoir")
                          root.after(2000, lbl.destroy)
                      
                  
                  root = tkinter.Tk()
                  lbl = tkinter.Label(root, text="Test")
                  lbl.pack()
                  ent = tkinter.Entry(root)
                  ent.pack()
                  ent.bind("<Return>", change_text)
                  root.mainloop()
                  

                  Un programme basique pour t'aider.


                  J'ai approximativement compris comment le programme que tu m'as envoyer fonctionne, mais je ne vois pas en quoi cela peut m'aider, car en fait ce que je veux c'est que à chaque entrée, cela créer une ligne dans le "tableau" et du coup que quand on clique sur recommencer cela supprime les lignes, sauf que je ne sait pas comment faire
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    29 novembre 2021 à 10:54:05

                    import tkinter
                    
                    def change_text(evt):
                        lbl1.config(text=ent.get())
                        lbl2.config(text=int(ent.get())*4)
                        
                    
                    root = tkinter.Tk()
                    
                    tit1 = tkinter.Label(root, text="Toto", relief=tkinter.SOLID, width=10)
                    tit1.grid(row=0,column=0)
                    
                    tit2 = tkinter.Label(root, text="Tata", relief=tkinter.SOLID, width=10)
                    tit2.grid(row=0,column=1)
                    
                     
                    lbl1 = tkinter.Label(root, text="")
                    lbl1.grid(row=1,column=0)
                    
                    lbl2 = tkinter.Label(root, text="")
                    lbl2.grid(row=1,column=1)
                    
                    ent = tkinter.Entry(root)
                    ent.grid(row=2,column=0,columnspan=2)
                    ent.bind("<Return>", change_text)
                    root.mainloop()
                    
                    Un autre bout de code
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 novembre 2021 à 10:58:15

                      ErispoeLeNarvalo a écrit:

                      import tkinter
                      
                      def change_text(evt):
                          lbl1.config(text=ent.get())
                          lbl2.config(text=int(ent.get())*4)
                          
                      
                      root = tkinter.Tk()
                      
                      tit1 = tkinter.Label(root, text="Toto", relief=tkinter.SOLID, width=10)
                      tit1.grid(row=0,column=0)
                      
                      tit2 = tkinter.Label(root, text="Tata", relief=tkinter.SOLID, width=10)
                      tit2.grid(row=0,column=1)
                      
                       
                      lbl1 = tkinter.Label(root, text="")
                      lbl1.grid(row=1,column=0)
                      
                      lbl2 = tkinter.Label(root, text="")
                      lbl2.grid(row=1,column=1)
                      
                      ent = tkinter.Entry(root)
                      ent.grid(row=2,column=0,columnspan=2)
                      ent.bind("<Return>", change_text)
                      root.mainloop()
                      

                      Un autre bout de code


                      Ca j'ai déjà compris, je sais le faire, ce que je voulais c'est que comme dans le code que j'ai déjà fait c'est une fonction qui crée des Labels dès qu'on clique sur "Jouer" et une autre qui les supprime
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        29 novembre 2021 à 11:14:18

                        Pas besoin... Bon je te donne la soluce :

                        import tkinter
                        
                        def change_text(evt):
                            if lbl1.cget("text") == "":
                                lbl1.config(text=ent.get())
                                lbl2.config(text=int(ent.get())*4)
                            else:
                                if lbl3.cget("text") != "":
                                    lbl1.config(text=lbl3.cget("text"))
                                    lbl2.config(text=lbl4.cget("text"))
                                lbl3.config(text=ent.get())
                                lbl4.config(text=int(ent.get())*4)
                            
                        
                        root = tkinter.Tk()
                        
                        tit1 = tkinter.Label(root, text="Toto", relief=tkinter.SOLID, width=10)
                        tit1.grid(row=0,column=0)
                        
                        tit2 = tkinter.Label(root, text="Tata", relief=tkinter.SOLID, width=10)
                        tit2.grid(row=0,column=1)
                        
                         
                        lbl1 = tkinter.Label(root, text="")
                        lbl1.grid(row=1,column=0)
                        
                        lbl2 = tkinter.Label(root, text="")
                        lbl2.grid(row=1,column=1)
                        
                        lbl3 = tkinter.Label(root, text="")
                        lbl3.grid(row=2,column=0)
                        
                        lbl4 = tkinter.Label(root, text="")
                        lbl4.grid(row=2,column=1)
                        
                        ent = tkinter.Entry(root)
                        ent.grid(row=3,column=0,columnspan=2)
                        ent.bind("<Return>", change_text)
                        root.mainloop()



                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 novembre 2021 à 11:34:13

                          J'ai compris comment ton programme fonctionne mais je ne vois pas comment je peu l'adapter au jeu de plus ou moins, car de base je ne veux pas créer les Labels manuellement, il m'en faudrait 49 donc cela fait un peu beaucoup. Mais comme je les crée dans une fonctionne, ils n'ont pas de nom donc je ne peu pas les supprimer

                          -
                          Edité par PaulCheveau 29 novembre 2021 à 11:35:54

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            29 novembre 2021 à 11:56:16

                            Drôle d'idée que de vouloir en mettre 49 à la suite mais bon...
                            import tkinter, time
                            
                            labels = []
                            
                            def creer(evt):
                                global labels
                                ROW = len(labels)+1
                                lbl = tkinter.Label(root,text=str(time.time_ns()))
                                lbl.grid(row=ROW,column=0)
                                labels.append(lbl)
                            
                            def supprimer(evt):
                                global labels
                                for lbl in labels:
                                    lbl.destroy()
                                labels = []
                            
                            root = tkinter.Tk()
                            but1 = tkinter.Button(root, text="Créer", width=20)
                            but2 = tkinter.Button(root, text="Supprimer", width=20)
                            
                            but1.bind("<ButtonRelease-1>", creer)
                            but2.bind("<ButtonRelease-1>", supprimer)
                            
                            but1.grid(row=0,column=0)
                            but2.grid(row=0,column=1)
                            
                            root.mainloop()

                            -
                            Edité par Anonyme 29 novembre 2021 à 11:58:27

                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 novembre 2021 à 14:54:23

                              PaulCheveau a écrit:

                              Donc comment je pourrais faire ?

                              Ajouter les Labels supprimer dans une liste spécifique et appliquer destroy aux objets de cette liste...

                              On peut aussi ne pas utiliser de liste spécifique pour taper dans ce que tkinter a déjà:

                              import tkinter as tk 
                              import time
                              
                              def creer():
                                  label = tk.Label(frame, text=time.time_ns())
                                  label.pack()
                               
                              def supprimer():
                                  for w in list(frame.children.values()):
                                      w.destroy()
                               
                              root = tk.Tk()
                              tk.Button(root, text="Créer", width=20, command=creer).grid(row=0,column=0)
                              tk.Button(root, text="Supprimer", width=20, command=supprimer).grid(row=0,column=1)
                              frame = tk.Frame(root)
                              frame.grid(row=1, column=0, columnspan=2)
                               
                              root.mainloop()
                              


                              De toutes façons, quand on ne sait plus faire avec le peu de Python qu'on connaît, c'est qu'il est temps d'améliorer ses connaissances plutôt que de bricoler en ce disant, ce que je veux faire n'est pas si compliqué comment font les autres?



                              -
                              Edité par mps 29 novembre 2021 à 14:56:25

                              • Partager sur Facebook
                              • Partager sur Twitter

                              supprimer des label avec une fonction (jeu + ou -)

                              × 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