Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bar de mesure avec Tkinter

    29 janvier 2015 à 0:48:57

    Bonjour, j'aimerais ajouter une bar de progression à l'enregistrement de mes mesures prises, voici le code : 

    compteur = 0
    for i in range(int(Val.get())):
    				compteur += 1
    				fichier=open("temp.txt", "a")
    				fichier.write(str(degres) + "\t" + time.strftime('%d/%m/%y %H:%M', time.localtime()) + "\t" + str(compteur) + "\n") 
    				fichier.close()
    			

    J'ai donc la variable Val.get() qui correspond aux nombres de mesures voulu donner par l'utilisateur, par exemple 10 mesures. 

    Je met aussi dans le fichier de mesures, un compteur qui augmente de 1 à chaque mesure.

    J'aimerais donc avoir une barre de progression entre 0 et la valeur Val.get() (10mesures par exemple) et qui avance avec la valeur du compteur qui augmente de 1 à chaque fois.

    Tkinter permet d'avoir une barre de progression appelé ProgessBar mais j'y comprend absolument rien, je ne sais pas où rentrer mes deux variables.

    J'ai trouvé un code pour faire fonctionner la barre, mais où insérer mes variables ??? :

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    from premier import *
    from tkinter import *
     
    # define gui
    gui=Tk()
    text=Text(gui, width="100" , height="100")
    progress=ttk.Progressbar(gui, mode="indeterminate", lenght="100")
    label=Label(gui, text=Premier.py)
    entry=Input(gui, textvariable="!!!")
     
    # create gui
    label.pack()
    entry.pack()
    text.pack()
    progress.pack()
     
     
    gui.mainloop()

    Merci d'avance :)

    • Partager sur Facebook
    • Partager sur Twitter
      29 janvier 2015 à 2:00:18

      Salut

      Après quelques recherches et quelques essais voilà ce que j'ai codé :

      class Forum(Tk):
          def __init__(self):
              Tk.__init__(self)
      
              self.b = Button(self, text = 'Vive le progrès', command = self.progression)
              self.pb = ttk.Progressbar(self, length = 100, mode = 'determinate')
              self.pb['value'] = 0
              self.pb['maximum'] = 100
      
              self.b.pack()
              self.pb.pack()
      
              self.x = 0
      
          def progression(self):
              self.x += 10
              self.pb['value'] = self.x
      
      
      Forum().mainloop()

      A chaque fois que tu cliques sur le bouton ça augmente de 10/100. Il te reste plus qu'à jouer avec value et maximum pour faire ce que tu veux :)

      • Partager sur Facebook
      • Partager sur Twitter
        29 janvier 2015 à 16:25:26

        Merci de ta réponse! Mais je suis vraiment nul... Je viens de découvrir les class avec ta méthode, mais comment l'appelé ? En utilisant ton code tout seul, la fenêtre apparaît bien, mais quand je le rajoute à mon code, la fenêtre n’apparaît pas...

        • Partager sur Facebook
        • Partager sur Twitter
          29 janvier 2015 à 16:49:40

          Mais non tu es pas nul, je sais mieux bidouiller que toi c'est tout. ^^ Je ne savais pas utiliser les Progressbar, ça m'a pris une bonne demi-heure pour apprendre à m'en servir comme je viens de te montrer là :)

          Et bien tu peux faire comme ceci pour l'utiliser :

          instance = Forum() #Forum a pour parent Tk() en quelque sorte
          #Donc tu peux l'utiliser de la même façon qu'un
          #root = Tk() par exemple 
          instance.mainloop()


          Quand tu le rajoute à ton code ? Comment ça ? Montre-moi ce que tu as fais, ça sera plus simple pour moi de te montrer ce qui ne va pas :)

          EDIT : Et j'ai utilisé une class car c'est bien plus pratique, tu peux accéder à ta Progressbar dans tout le programme comme cela :). Je te conseil fortement d'apprendre à te servir des class, c'est indispensable :)

          -
          Edité par InhumanRampage 29 janvier 2015 à 16:54:44

          • Partager sur Facebook
          • Partager sur Twitter
            29 janvier 2015 à 19:02:34

            Quand j'appuie sur un bouton, j'active la commande Enregistrer qui donne ceci :

            def Enregistrer():
            	compteur = 0
            	for i in range(int(Val.get())):
                            compteur += 1
            				i =i+1
                            fichier=open("temp.txt", "a")
                            fichier.write(str(degres) + "\t" + time.strftime('%d/%m/%y %H:%M', time.localtime()) + "\t" + str(compteur) + "\n")
                            fichier.close()
                        



            Et je n'arrive pas à intégrer la barre pour qu'elle s'actualise à chaque enregistrement (qui ici correspond au nombre Val.get())

            J'ai essayé 50 truc différents, mais je n'y arrive pas, la barre doit avoir comme valeur maximale Val.get() et doit avancer de 1 à chaque fois que la boucle for se répète, je ne peux pas te mettre ce que j'ai essayé car j'ai tout supprimé comme rien ne marché... Si tu sais comment faire :)



            -
            Edité par Kyar 29 janvier 2015 à 19:25:01

            • Partager sur Facebook
            • Partager sur Twitter
              29 janvier 2015 à 19:49:15

              Ta boucle for est fausse déjà, on utilise for pour pas à avoir à incrémenter, donc enlève i = i + 1 :)

              Ensuite, si c'est juste une progression à chaque passage de boucle, c'est très facile à faire : (en fait il faut utiliser update_idletasks)

              class Forum(Tk):
                  def __init__(self):
                      Tk.__init__(self)
               
                      self.b = Button(self, text = 'Vive le progrès', command = self.progression)
                      self.pb = ttk.Progressbar(self, length = 100, mode = 'determinate')
                      self.pb['value'] = 0
                      self.pb['maximum'] = 10 # < Val.get()
               
                      self.b.pack()
                      self.pb.pack()
               
                      self.x = 0
               
                  def progression(self):
                      for n in range(10): #10 correspond à Val.get()
                          #Tes actions
                          
                          self.pb['value'] = n+1
                          self.pb.update_idletasks()
                          self.pb.after(1000) #On attend 1000ms sinon la bar se remplie instantanément ^^'
               
              Forum().mainloop()

              widget.update_idletasks() met à jour le widget, je m'en sers tout le temps, mais je crois que c'est un défaut de Python 27 :)

              Voilà, dit moi s'il y a encore un truc que tu ne comprends pas.

              EDIT : Je viens de tester avec une autre valeur, genre 5, et il faut que ça soit en base 10, ou alors que la length de ta Progressbar fasse 50 !

              Tu peux faire : 

                  def progression(self):
                      for n in range(5): #5 correspond à Val.get()
                          #Tes actions
              
                          self.pb['value'] = (n+1)*2 #Pour mettre en base 10, pour que ça soit
                                                     #raccord à length !
                          self.pb.update_idletasks()
                          self.pb.after(1000)

               EDIT 2 : Ou alors ne pas se baser sur n pour augmenter value mais sur un pourcentage !

              -
              Edité par InhumanRampage 29 janvier 2015 à 19:59:25

              • Partager sur Facebook
              • Partager sur Twitter
                29 janvier 2015 à 20:51:32

                Alors, je viens de trouver après 50 essais ! N'ayant rien compris à l'utilisation des class et grâce à toi et à "widget.update_idletasks()" j'arrive à avoir une barre qui fonctionne :D

                Voici mon code qui est dégueulasse mais qui fonctionne ^^' :

                def Enregistrer():
                	compteur = 0
                	bar = Tk()
                	pb = ttk.Progressbar(bar, length = 100, mode = 'determinate')
                	pb['maximum']= Val.Get()
                	x = 0
                	x += 1
                	pb.pack()
                	
                	for i in range(int(Val.get())):
                                compteur += 1
                				pb['value'] = int(compteur)
                				
                                fichier=open("temp.txt", "a")
                                fichier.write(str(degres) + "\t" + time.strftime('%d/%m/%y %H:%M', time.localtime()) + "\t" + str(compteur) + "\n")
                                fichier.close()
                				pb.update_idletasks()
                            



                • Partager sur Facebook
                • Partager sur Twitter
                  29 janvier 2015 à 21:22:31

                  Holy... !! Je suis content que tu aies trouvé une solution, mais dire que ton code est dégueulasse c'est un euphémisme :lol:
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Bar de mesure avec 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