Python > stopper une fonction [Résolu/Fermé]

Signaler
Messages postés
37
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
19 mars 2009
-
Messages postés
37
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
19 mars 2009
-
Salut tout le monde =)


Voilà, j'ai un code qui ressemble à ça :
_____________________
def F_1():
. . . . global x # au départ mon x est de l'ordre de 10
. . . . while x>1:
. . . . . . . . sleep(0.8) # ça je crois que ça sert a rien pour ce pb
. . . . . . . . Action() # sachant que mon Action fait tendre le x global vers 0

# ==> du coup, j'ai ma fonction F_1 qui tourne jusqu'à ce que x=<1
_____________________

Maintenant j'aimerais faire un truc du genre :

def F_2():
. . . . break(F_1)


avec plus loin un bouton qui lance et relance F_1
et un autre bouton qui lance F_2, c'est-à-dire qui met sur pause en quelque sorte ma F_2
(les boutons c'est ok)

5 réponses

Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 491
Tu vas me dire que je pinaille mais autant attendre le thread sans boucler:
def OnButtonClick(self):
        '''' Quand le bouton est cliqué. '''
        self.labelVariable.set( u"Bouton cliqué" )
        self.traitement.stop()  # On demande au traitement de s'arrêter.
        self.traitement.join() # On attend la fin du traitement.
        # Et on affiche le résultat:
        self.labelVariable.set( u"Résultat: %d" % self.traitement.resultat() )
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 264
Tu vas me dire que je pinaille mais autant attendre le thread sans boucler:

Tu as raison.

La raison pour laquelle j'ai tendance à faire comme ça est que j'utilise parfois le while pour continuer à afficher des infos en attendant la mort du thread. Mais le join() est un meilleur choix.
Messages postés
37
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
19 mars 2009
12
Merci beaucoup sebsauvage (t'es un amour on te l'a jamais dis ? heu..non)
Ta réponse est clair et précise, c'est tout ce que j'attendais.

Je vais de ce pas étudier le threading...

Merci pour la rectification kilian ;)
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 264
:-)

Ah la séparation des traitements/GUI, un vrai bonheur.

Donc tu veux que ton interface graphique continue à répondre même quand il y a des traitements.

Il faudrait faire du multithreading.

En gros, le thread principal s'occupe de l'interface graphique (comme maintenant), mais tu as un objet qui s'occupe des traitements et qui tourne dans un thread séparé.

Et par pitié, évite les 'global'.

Je vais essayer de te bricoler un exemple que je posterai ici.
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 264
Voilà l'exemple:

Le programme suivant affiche une fenêtre, et fait des traitements en tâche de fond.
Quand tu clic le bouton, le traitement s'arrête et l'interface affiche le résultat.

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
import Tkinter,threading,time

class Traitement(threading.Thread):
    ''' Un objet qui fait ses traitements dans un thread séparé. '''
    def __init__(self,valeurDeDepart):
        threading.Thread.__init__(self)
        self._arret = False
        self._valeur = valeurDeDepart
        
    def run(self):
        while self._valeur>0 and not self._arret:
            self._valeur = self._valeur - 1
            print u"Thread: Je travaille... (valeur=%d)" % self._valeur
            time.sleep(1)
        print u"Thread: J'ai terminé !"
            
    def stop(self):
        self._arret = True

    def resultat(self):
        return self._valeur

class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()
        self.traitement = Traitement(15)
        self.traitement.start()  # On démarre le traitement

    def initialize(self):
        ''' On créé l'interface graphique. '''
        self.grid()
        button = Tkinter.Button(self,text=u"Cliquez pour arrêter le traitement",command=self.OnButtonClick)
        button.grid(column=1,row=0)
        self.labelVariable = Tkinter.StringVar()
        label = Tkinter.Label(self,textvariable=self.labelVariable,anchor="w")
        label.grid(column=0,row=0)
        self.labelVariable.set(u"Hello !")

    def OnButtonClick(self):
        '''' Quand le bouton est cliqué. '''
        self.labelVariable.set( u"Bouton cliqué" )
        self.traitement.stop()  # On demande au traitement de s'arrêter.
        while self.traitement.isAlive(): # On attend la fin du traitement.
            time.sleep(0.2)
        # Et on affiche le résultat:
        self.labelVariable.set( u"Résultat: %d" % self.traitement.resultat() )

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('mon application')
    app.mainloop()