IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Attendre résultat d'un callback


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Points : 26
    Points
    26
    Par défaut Attendre résultat d'un callback
    Bonjour à tous

    Je ne sais pas si tout ce que je vais dire est correct mais bon.

    Lorsqu'on démarre une fonction en "callback" dans un une fenêtre Tkinter, comme dans le code ci-dessous par le clic du bouton.
    Tk se charge de l’exécution en parallèle de la fonction action() et la main est rendue à la fonction appelante (dans l'exemple start())
    Comment attendre la fin de la fonction action() avant de reprendre l’exécution de la fonction start()

    Par exemp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from tkinter import *
    import time
     
    def start():
        fen1.after(1000, action)
     
    def action():
        print("Je suis dans action")
     
    fen1 = Tk()
    txt1 = Label(fen1, text="exemple")
    txt1.grid(row=1)
    bouton1 = Button(fen1, text='Démarrer', command=lambda: start())
    bouton1.grid(row=2)
     
    fen1.mainloop()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 352
    Points : 36 876
    Points
    36 876
    Par défaut
    Salut,

    Citation Envoyé par tm68780 Voir le message
    Comment attendre la fin de la fonction action() avant de reprendre l’exécution de la fonction start()
    La fonction start est terminée bien avant que le callback action ne démarre.
    Pour le visualiser pour pourriez ajouter des "print"...

    Donc on ne peut pas...

    Citation Envoyé par tm68780 Voir le message
    Tk se charge de l’exécution en parallèle de la fonction action() et la main est rendue à la fonction appelante (dans l'exemple start())
    Tout l'intérêt de la programmation évènementielle est justement de ne rien avoir qui se déroule en parallèle mais de garantir qu'un callback ne sera appelé qu'après la fin du callback précédent.

    Cela peut vous paraître futile mais c'est ce qui garantit l'intégrité de l'état de l'application. Lorsqu'un un callback démarre, s'il teste ou met à jour une variable (non locale), rien d'autre n'ira la changer...

    Intégrité qu'on peut mettre en défaut avec l'utilisation intempestive d'update dans un callback...

    - W

  3. #3
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 899
    Points : 1 581
    Points
    1 581
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    J'utiliserai un 'flag' pour executer le after de start() sous condition...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    from tkinter import *
     
    porte = {'flag':True} 
    def start():
        if porte['flag']:
            porte['flag'] = False
            fen1.after(1000, action)
     
    def action():
        print("Je suis dans action")
        porte['flag'] = True
     
    fen1 = Tk()
    txt1 = Label(fen1, text="exemple")
    txt1.grid(row=1)
    bouton1 = Button(fen1, text='Démarrer', command=lambda: start())
    bouton1.grid(row=2)
     
    fen1.mainloop()

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Points : 26
    Points
    26
    Par défaut
    Bonjour à tous

    Je reprends depuis le début.

    Lorsqu'on démarre une fonction en "callback" dans un une fenêtre Tkinter, par le clic du bouton.
    Tk se charge de l’exécution de la fonction action() et la main est rendue à la fonction appelante.

    Comment attendre la fin de la fonction action() avant de reprendre l’exécution de la fonction start().
    OK ça on ne peut pas mais

    Pourquoi cette question:
    Je suis dans une fenêtre Tkinter et sur le clic bouton je démarre une fonction d'animation.
    Cette animation doit être terminée avant de poursuivre mon programme.
    Ne pourrais-je pas utiliser "bind" pour attendre un évènement dans la fenêtre (genre prise de focus d'un widget) pour poursuivre mon programme ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 352
    Points : 36 876
    Points
    36 876
    Par défaut
    Salut,

    Citation Envoyé par tm68780 Voir le message
    Cette animation doit être terminée avant de poursuivre mon programme.
    Le clic sur le bouton démarre l'animation, la fin de l'animation démarre la suite... c'est quoi le soucis? D'autant que dans votre exemple, rien ne représente ce qui vient après...

    - W

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Le clic sur le bouton démarre l'animation, la fin de l'animation démarre la suite... c'est quoi le soucis?
    - W
    Bonjour,

    Le soucis et vous l'avez dit aussi Start continue de s'executer sans attendre que action soit terminée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    from tkinter import *
    import time
     
     
    def start():
        fen1.after(1000, action)
     
        # Je veux continuer ici
        # A moins d'utiliser une nouvelle construction de ce type fen1.after(1000, nouvelleAction)
        # C'est pas très propre non plus aec tous ces déalais
     
    def action():
        print("Je suis dans action")
     
     
    fen1 = Tk()
    txt1 = Label(fen1, text="exemple")
    txt1.grid(row=1)
    bouton1 = Button(fen1, text='Démarrer', command=lambda: start())
    bouton1.grid(row=2)
     
    fen1.mainloop()

Discussions similaires

  1. Retourner le résultat AJAX avec CALLBACK
    Par informer dans le forum jQuery
    Réponses: 7
    Dernier message: 08/06/2014, 17h32
  2. [AS2] attendre résultat de sendAndLoad avant de continuer
    Par ViveLesQuads dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 14/10/2008, 08h58
  3. Réponses: 4
    Dernier message: 22/03/2007, 11h13
  4. [Oracle] Exécuter une procédure stockée sans en attendre le résultat
    Par glutock dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/02/2007, 13h54
  5. Attendre le résultat de shellexecute
    Par fumidu dans le forum C++Builder
    Réponses: 6
    Dernier message: 27/07/2006, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo