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 :

mainloop() pour un temps limité seulement


Sujet :

Tkinter Python

  1. #1
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut mainloop() pour un temps limité seulement
    Bonjour,

    Est-il possible d'apeller Tk.mainloop() de sorte que l'on sorte de mainloop() au bout d'un temps limité pour récupérer la main sur le main thread ? Il faut bien sur que l'appel suivant à Tk.mainloop() continue la MEME boucle dans l'état ou on l'a laissé, au lieu d'en recommencer une nouvelle.

    Cette fonctionalité existe par exemple en pygame

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Salut,

    L'idée est qu'on sort de mainloop lorsqu'on voit '.quit' arriver dans la liste des events... Donc "il suffit":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def mainloop(root, delay):
         root.after(delay, root.quit)
         root.mainloop()
    note: mainloop appelle in fine tk_DoOneEvent pour traiter un event mais tk_DoOneEvent peut être appelé récursivement...

    - W

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Merci Wiztricks,

    Mais lors du 2eme appel à ta fonction mainloop(), il me semble que tkinter va recommencer un nouvelle loop. Ile me semble par exemple les events qui étaient en pile mais pas encore traités seront perdus.

    Je me trompe ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Citation Envoyé par VV33D Voir le message
    Je me trompe ?
    Les events s'empilent de toutes façons.
    .update et .mainloop les dépilent.

    Mais lors du 2eme appel à ta fonction mainloop(), il me semble que tkinter va recommencer un nouvelle loop
    Le "il me semble que", c'est une question ouverte ou le comportement d'un bout de code?
    - W

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Et bien cela continu a tourner en fait.
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    try:
        import tkinter as Tk
    except:
        import Tkinter as Tk
     
    class tk_app(Tk.Tk):
        def __init__(self):
            Tk.Tk.__init__(self)
            self.intval = Tk.IntVar(self)
            self.lab = Tk.Label(self, textvariable=self.intval)
            self.lab.pack()
            Tk.Button(self, text='Quit', command=self.on_quit).pack(side=Tk.LEFT)
            self.id = None
            self.lab_update()
     
        def lab_update(self):
            self.intval.set(self.intval.get() + 1)
            self.id = self.after(500, self.lab_update)
     
        def on_quit(self):
            if self.id:
                self.after_cancel(self.id)
            self.quit()
            #self.destroy()
     
        def app_start(self, delay=None):
            if delay:
                self.after(delay, self.quit)
            self.mainloop()
     
    if __name__ == "__main__":
        from sys import version
     
        if version.startswith('3'):
            raw_input = input
     
        app = tk_app()
        app.app_start(10000)
        raw_input("hit enter to restart the mainloop > ")
        app.app_start()
    Edit: Un tk.call de vwait (wait_variable) pour bloquer l'interpréteur Tcl ?

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Merci à tous les deux, je suis en train de tester cela.

    Un seul petit problème pour l'instant, je voudrais pouvoir distinguer les quit() issus de nos self.after ; et ceux issus d'un click de l'utilisateur (je veux callback() dans le 2eme cas, mais pas dans le 1er).

    Comment procéder ?

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    C'est dans le code juste au dessus
    def on_quit(self):
    if self.id:
    self.after_cancel(self.id)
    self.quit()
    et dans la faq: soit ici self.protocol("WM_DELETE_WINDOW", self.on_quit)
    Il suffit d'associer la fonction voulue.

  8. #8
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Merci beaucoup, c'est nickel.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Temps limite pour le passage d'une fonction
    Par AliHome dans le forum Windows Forms
    Réponses: 0
    Dernier message: 06/09/2009, 17h02
  2. [Java]Solutions graphiques pour jeu temps réel (titre édité)
    Par Zeil dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 18/03/2006, 05h53
  3. [VB6] Rendre la main au système pour un temps donné
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/03/2006, 08h38
  4. Comment faire pour ajouter une ligne seulement !
    Par Fredri dans le forum Access
    Réponses: 1
    Dernier message: 26/12/2005, 11h44
  5. SGBDR pour jeu temps réel ?
    Par vmolines dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 20/07/2005, 16h17

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