Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Tkinter] Problème avec une nouvelle fenêtre

    16 novembre 2017 à 18:03:26

    Bonjour, je suis entrain de réaliser un projet système et réseau avec des camarades. Nous avons décidé de réaliser l'interface graphique avec Tkinter. Cette technologie est donc très nouvelle pour moi et je vous prie de m'excuser pour les bêtises que je risque de dire.

    L'interface est composé de plusieurs canvas avec des images et un bouton "déploiement". Je voudrai que lorsque l'on presse ce bouton, une barre de chargement (progressbar) s'affiche. Manque de temps (L'interface graphique étant seulement un plus a notre projet), j'ai récupéré un bout de code pour avec une barre de chargement pré-faite mais je n'arrive pas à l'intégrer à mon code. 

    J'ai essayer de l'afficher dans ma fenêtre grâce au bouton mais elle ne s'affiche pas, surement car c'est une fonction qui l'affiche. J'ai donc eu l'idée de l'afficher dans une nouvelle fenêtre avec toplevel. MAIS RIEN NE MARCHE =(  et la console ne me retourne pas d'erreur ..

    Ici le code de la barre que j'ai modifié qui fonctionne à part.

    class MainWindow(Frame):
    
            def __init__(self):
                Frame.__init__(self)
                self.master.title("ProgressBar example")
                self.grid(sticky=E+W+N+S)
    
                self.var_det = IntVar(self)
    
                self.pbar_det = ttk.Progressbar(self, orient="horizontal", length=400, mode="determinate", variable=self.var_det, maximum=100)
                self.pbar_det.grid(row=2, column=0, pady=2, padx=2, sticky=E+W+N+S, columnspan=3)
    
                Label(self, text="determinate").grid(row=3, column=0, pady=2, padx=2, sticky=E+W+N+S)
        
                self.lab_det_var = Label(self, text="VAR:")
                self.lab_det_var.grid(row=3, column=1, pady=2, padx=2, sticky=E+W+N+S)
    
                self.lab_det_max = Label(self, text="MAX:")
                self.lab_det_max.grid(row=3, column=2, pady=2, padx=2, sticky=E+W+N+S)
    
            #-----
    
                Label(self, text="ANIMATION:").grid(row=4, column=0, pady=2, padx=2, sticky=E+W+N+S)
    
                Button(self, text='START', command=self.animation_start).grid(row=4, column=1, pady=2, padx=2, sticky=E+W+N+S)
                Button(self, text='STOP', command=self.animation_stop).grid(row=4, column=2, pady=2, padx=2, sticky=E+W+N+S)
    
     
    
                self.update_labels_after = False
                self.update_labels()
        
    
            def animation_start(self):
                self.update_labels_after = True
    
                self.pbar_det.start() # .start(1)
    
                self.update_labels()
    
            def animation_stop(self):
                self.update_labels_after = False
    
    
                self.pbar_det.stop()
    
                self.update_labels()
          
    
            def update_labels(self):
    
    
                self.lab_det_var.config(text='VAR: %d' % (self.var_det.get()))
                self.lab_det_max.config(text='MAX: %d' % (self.pbar_det.cget('maximum')))
            
                if self.update_labels_after:
                    self.after(50, self.update_labels)

    et voici la fonction toplevel et le bouton correspondant

    def nouvelle():
        root2=Toplevel()
        root2.grab_set()
        root2.focus_set()
        root2.geometry("500x300")
        root2.resizable(False,False)
        root2.title("Nouvelle fenetre")
    
    BoutonLancer = Button(root, text ='Deploy', command=nouvelle)
    BoutonLancer.pack(side = TOP, padx = 0, pady = 0)

    Pour intégrer la barre, je l'ai mis dans la fonction nouvelle à la suite des paramètres de la fenêtre.
    Quelqu'un pourrait m'aider s'il vous plait?

    Merci d'avance!

    -
    Edité par Baboubabz 16 novembre 2017 à 18:10:06

    • Partager sur Facebook
    • Partager sur Twitter
      16 novembre 2017 à 21:19:10

      Salut,

      Comment exécutez-vous le frame (MainWindow)? Parce que, dans votre fonction (nouvelle), vous n'appelez même pas le Frame.

      De plus, il manque le parent, comme paramètre au frame.

      class MainWindow(Frame):
          def __init__(self, parent):
              #Frame.__init__(self, parent) ## PYTHON 2.7
              super().__init__(parent) ## PYTHON 3.X
      
      
      fenetre = Tk()
      
      def nouvelle():
          root2 = Toplevel()
          frame_progressbar = MainWindow(root2) ## J'APPELLE LE FRAME
          frame_progressbar.pack() ## JE PLACE LE FRAME
      
      
      btn = tk.Button(fenetre, text=Deploy', command=nouvelle)
      btn.pack()
      
      fenetre.mainloop()

      Ensuite, lorsque l'on recopie des codes, déjà tout fait. On s'en sert pour décortiquer et comprendre son fonctionnement.

      ** Vous voulez sauver du temps, mais au final, vous en perdez à écrire un post, pour du code que vous avez pas écrit.. Es-ce mieux?

      Je me rappelle, avoir déjà fait un exemple, je ne trouve plus le lien, mais voici un résumé (si cela peut aider):

      import tkinter as tk
      import tkinter.ttk as ttk
      
      class ProgressBar(tk.Frame):
          def __init__(self, parent, 
                       length=200, maximum=50,
                       orient=tk.HORIZONTAL, mode='determinate'):
      
              super().__init__(parent)
      
              self.maximum = maximum
              self.progressbar = ttk.progressbar(
                  self, orient=orient, length=length, mode=mode)
              self.progressbar.pack()
      
              self.running = False
      
          def update(self, timer=1000):
              self.progressbar['value'] += 1
              if self.running:
                  self.after(timer, self.update, timer)
      
          def start(self):
              self.reset()
              self.running = True
              self.update()
          def stop(self):
              self.running = False
          def reset(self):
              self.progressbar['value'] = 0
              self.progressbar['maximum'] = self.maximum
      
      
      fenetre = tk.Tk()
      
      progressbar = ProgressBar(fenetre)
      progressbar.pack()
      
      btn_start = tk.Button(fenetre, text='Start', command=progressbar.start)
      btn_start.pack()
      
      btn_stop = tk.Button(fenetre, text='Stop', command=progressbar.stop)
      btn_stop.pack()
       
      fenetre.mainloop()

      Pour finir, avec cet exemple, vous devrier être capable de placer le frame, dans votre fenetre principale (ou secondaire).

      De plus, je crois que votre code est presque correct. Il manque seulement le frame, dans la fonction "nouvelle". (Comme mon exemple, du haut)

      N'hésitez pas pour les questions.

      Bonne chance

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        16 novembre 2017 à 23:07:57

        Merci beaucoup pour la réponse rapide et de votre aide ! Je vais travailler la dessus! :-)

        A+

        • Partager sur Facebook
        • Partager sur Twitter

        [Tkinter] Problème avec une nouvelle fenêtre

        × 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