Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tkinter et threading

Exécuter 2 taches en parallèle

Sujet résolu
    16 mai 2015 à 18:05:29

    Bonjour,

    Je vous présente mon problème : je dispose d'une fenêtre graphique avec un bouton à l'intérieur, créée avec le module tkinter. En fond, j'ai une boucle assez longue qui tourne, et j'aimerais que quand je clique sur ce bouton, la boucle se mette en pause, quitte à être reprise plus tard. La boucle est à l'extérieur de la classe de l'interface graphique. Je me suis renseigné du côté du threading, mais je n'arrive pas à voir comment résoudre ce problème particulier.

    Le code que j'utilise pour le moment est celui-ci :

    from Tkinter import *
    from threading import Thread
    import time
    
    sleep = False
    
    class MyGUI(Tk):
      def __init__(self):
        Tk.__init__(self)
        Button(self, text="Pause", command=self.pause).pack()
    
      def pause(self):
        sleep = True
    
    def maBoucle():
      for j in range(1000):
        while not(sleep):
           time.sleep(0.1)
        print(j)
    
    class GUIThread(Thread):
      def __init__(self):
        Thread.__init__(self)
    
      def run(self):
        self.window = MyGUI()
        self.window.mainloop()
    
    newGUIThread = GUIThread()
    boucle = Thread(target = boucle)
    newGUIThread.start()
    boucle.start()

    Mais ça ne marche évidemment pas. Du coup, je suis ouvert à vos propositions !

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      16 mai 2015 à 22:11:10

      L'idée est bonne, mais c'est pas la GUI qu'il faut mettre dans un thread, c'est la fonction. Et il faut aussi que les interrupteurs soit à porté de cette fonction.

      from threading import Thread
      from time import sleep
      from tkinter import Button, Label, Tk
      
      
      class App(Tk):
      
          def __init__(self):
              Tk.__init__(self)
              self.label = Label(self, text="Stopped.")
              self.label.pack()
              self.play_button = Button(self, text="Play", command=self.play)
              self.play_button.pack(side="left", padx=2, pady=2)
              self.stop_button = Button(self, text="Stop", command=self.stop)
              self.stop_button.pack(side="left", padx=2, pady=2)
              self._thread, self._pause, self._stop = None, False, True
      
          def action(self):
              for i in range(1000):
                  if self._stop:
                      break
                  while self._pause:
                      self.label["text"] = "Pause... (count: {})".format(i)
                      sleep(0.1)
                  self.label["text"] = "Playing... (count: {})".format(i)
                  sleep(0.1)
              self.label["text"] = "Stopped."
      
          def play(self):
              if self._thread is None:
                  self._stop = False
                  self._thread = Thread(target=self.action)
                  self._thread.start()
              self._pause = False
              self.play_button.configure(text="Pause", command=self.pause)
      
          def pause(self):
              self._pause = True
              self.play_button.configure(text="Play", command=self.play)
      
          def stop(self):
              if self._thread is not None:
                  self._thread, self._pause, self._stop = None, False, True
              self.play_button.configure(text="Play", command=self.play)
      
      
      App().mainloop()
      
      • Partager sur Facebook
      • Partager sur Twitter
        16 mai 2015 à 22:54:24

        Ca marche nickel ! Merci beaucoup :)
        • Partager sur Facebook
        • Partager sur Twitter

        Tkinter et threading

        × 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