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 :

Compte à rebours tkinter


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2012
    Messages : 7
    Par défaut Compte à rebours tkinter
    Bonjour à tous, je fais un programme de question/réponse comme devoir (que je dois rendre vendredi) et je voudrai mettre en place un compte à rebours laissant à l'utilisateur 30 secondes pour répondre. J'ai déjà mon compte à rebours mais lorsque je l'ai adapté en tkinter et que je le lance, au lieu de compter 30 secondes lorsque j'appuie sur le bouton, il lance la fenetre apres les 30 secondes. Voici le code sans interface graphique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import time
    def decompte(fun, t=15):
        for i in range(t):
            fun(t-i)
     
            time.sleep(1)
        fun(0)
        print("FINI")
    decompte(lambda x: print(x))
    En effet, une personne m'a aidé à faire ce programme et m'a ensuite dit qu'il n'y avait pas besoin de lambda mais je n'arrive pas à faire fonctionner le programme sans.
    Et voici mon essai avec interface graphique:
    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
    import time
    import tkinter as tk
     
     
    def decompte(fun, t=5):
        for i in range(t):
            fun(t-i)
            time.sleep(1)
        fun(0)
     
     
     
    fen1=tk.Tk()
     
    lab=tk.Label(fen1, text="")
    lab.pack()
     
    btn=tk.Button(fen1, text="Compte à rebours",command=decompte(lambda x: lab.config(text=x)))
    btn.pack()
     
    fen1.mainloop()
    Merci et essayez de m'aider le plus vite possible

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Une interface graphique, c'est une boucle sans fin (.mainloop) qui doit dépiler les événements clavier/souris et mettre à jour ses windows en conséquence.

    La suite "time.sleep(1)" stoppe la "boucle" et l'interface se gèle en attendant la fin de "decompte".

    D'ici Vendredi vous pourriez regarder la documentation de la méthode tkinter appelée .after qui devrait pouvoir remplacer time.sleep(1) "dans ce contexte".

    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2012
    Messages : 7
    Par défaut
    Et pour ce qui est du lambda, il ne pose pas de problèmes?

  4. #4
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    amha le probleme se siturait plutot ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    btn=tk.Button(fen1, text="Compte à rebours",command=decompte(lambda x: lab.config(text=x)))
    la fonction/methode definie comme <command> doit s'attendre a recevoir, en premier argument, un "Event", qui donne les informations sur l'action generee. donc, ta fonction decompte, recevrait a la place de lambda x, un Event. Ceci etant les reference en valeur par defaut en Python etant tetues (elle persistent) decompte recevra bien ce lambda x:... Mais, d'ou proviendrait la valeur de x?
    Ou pensait tu as un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... command=lambda :decompte(lambda x: lab.config(text=x))
    fs: Tous ces lambda U print me donnent le tourni
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par psykozz Voir le message
    Et pour ce qui est du lambda, il ne pose pas de problèmes?
    lambda x: lab.config(text=x) crée une fonction avec le paramètre "x" à partir de lab.config. La fonction "adapte" l'appel à "lab.config" pour qu'il soit "comestible" par "decompte".

    Ce qui ne va pas, c'est le "manque de lambda" dans: "command=decompte(lambda x: lab.config(text=x))"

    "command" attend une fonction qui sera appelée lorsqu'on click sur le Button et non le retour de la fonction "decompte".
    => Ca attend là plutôt que lorsqu'on clique sur le Button.
    Techniquement, "command=lambda: decompte(lambda x: lab.config(text=x))" serait plus "correct" pour l'interface attendue par "command".
    Mais çà ne fait que déplacer le problème induit par time.sleep.

    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2012
    Messages : 7
    Par défaut
    Merci de vos réponses, j'ai réussi à créer un autre compte à rebours avec la fonction .time() et la fonction .after(). Le principe de la fonction after est de rafraichir à un temps donné et time est le nombre de secondes passées depuis 1970 ou quelque chose comme ça, bref, un très gros chiffre. Seulement,lorsque j'appuie sur le bouton et que le décompte se lance, la fenetre m'affiche le 10, (pour 10 secondes) puis les 9 apres moins d'une seconde.Voici la code:
    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
    import time as t
    import tkinter as tk
     
    def start():
        global temps1, temps2, chron
        temps1= t.time()
        chrono()
    def chrono():
        global temps1, temps2, chron
        temps2= t.time()
        chron=10-temps2+temps1
        lab.config(text=int(chron))
        if (chron>=0):
            fen1.after(100,chrono)
     
     
    fen1=tk.Tk()
     
    lab=tk.Label(fen1, text="")
    lab.pack()
     
    btn=tk.Button(fen1, text="go",command=start)
    btn.pack()
     
    btn2=tk.Button(fen1, text="quit",command=fen1.destroy)
    btn2.pack()
     
    fen1.mainloop()
    Auriez-vous une idée d'où provient le problème?

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    decompte égrène le nombre de secondes jusqu'à 0.
    Le premier paramètre d'.after s'exprimant en millisecondes .after(1000, ...) devrait être "suffisant" pour déclencher le décompte et reposter le cas échéant.

    Pour faire çà a-t-on besoin de regarder l'heure qu'il est, en plus, tous les dixièmes de secondes???
    Je ne pense pas.
    Donc plus de question

    Ce qui allège quelque peu la chose

    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
    import time as t
    import tkinter as tk
     
    def decompte(count=10):
        lab.config(text=str(count))
        if count > 0 :
            fen1.after(1000,decompte, count-1)
     
    fen1=tk.Tk()
     
    lab=tk.Label(fen1, text="")
    lab.pack()
     
    btn=tk.Button(fen1, text="go", command=decompte)
    btn.pack()
     
    btn2=tk.Button(fen1, text="quit",command=fen1.destroy)
    btn2.pack()
     
    fen1.mainloop()
    Maintenant que "decompte" fonctionne (et sans lambda), il vous faut repartir dans la doc d'.after pour voir comment arrêter ce tic tac...
    Perdre à tous les coups ne donnera guère envie de jouer

    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. [timer] Compte à rebours pour redirection !
    Par Raideman dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/12/2005, 20h07
  2. Compte à rebours
    Par Anduriel dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 29/12/2005, 20h12
  3. compte à rebours
    Par Datord dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 17/11/2005, 21h22
  4. compte à rebours
    Par etoile1506 dans le forum C
    Réponses: 10
    Dernier message: 27/10/2005, 15h20
  5. Compte à rebours trop rapide
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/06/2005, 20h57

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