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 :

délai d'affichage dans un canevas


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    Par défaut délai d'affichage dans un canevas
    Bonjour à tous

    Je cherche comment mettre un délai entre la modification de 2 cercles dans un canevas

    A l'origine j'utilisais un "time.sleep" est ce que le code suivant est plus "propre"

    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
    from tkinter import *
    import time
     
    window = Tk()
    window.geometry("480x360")
    can1 = Canvas(window, bg='dark grey', height=330, width=440)
    can1.pack(expand="YES")
     
    ampoule1 = can1.create_oval(30, 30, 90, 90, width=4, fill='grey')
    ampoule2 = can1.create_oval(30, 110, 90, 170, width=4, fill='grey')
     
    can1.update()
    can1.after(1000)
    can1.itemconfigure(ampoule1, fill='red')
    can1.update()
    can1.after(1000)
    can1.itemconfigure(ampoule2, fill='red')
    can1.update()
     
    window.mainloop()

  2. #2
    Membre confirmé
    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
    Par défaut
    Je pense que c'est meux :-)

    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
    from tkinter import *
    import time
     
    window = Tk()
    window.geometry("480x360")
    can1 = Canvas(window, bg='dark grey', height=330, width=440)
    can1.pack(expand="YES")
     
    ampoule1 = can1.create_oval(30, 30, 90, 90, width=4, fill='grey')
    ampoule2 = can1.create_oval(30, 110, 90, 170, width=4, fill='grey')
     
    can1.update()
    can1.after(1000,can1.itemconfigure(ampoule1, fill='red'))
    can1.update()
    can1.after(1000,can1.itemconfigure(ampoule2, fill='red'))
    can1.update()
     
    window.mainloop()

  3. #3
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    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 : 923
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par tm68780 Voir le message
    Je pense que c'est meux :-)
    Bonjour,
    Avec la programation évenementiel il n'est pas nécessaire d'utiliser la méthode update.
    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
    from tkinter import *
    import time
     
    window = Tk()
    window.geometry("480x360")
    can1 = Canvas(window, bg='dark grey', height=330, width=440)
    can1.pack(expand="YES")
     
    ampoule1 = can1.create_oval(30, 30, 90, 90, width=4, fill='grey')
    ampoule2 = can1.create_oval(30, 110, 90, 170, width=4, fill='grey')
     
    def action(ampoule,fill):
        can1.itemconfigure(ampoule, fill=fill)
     
    can1.after(1000,lambda :action(ampoule1,'red')) 
    can1.after(2000, lambda :action(ampoule2,'red'))
     
    window.mainloop()

  4. #4
    Membre confirmé
    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
    Par défaut
    Merci pour la réponse

    en regardant la description de la fonction lambda (fonction anonyme) je ne vois pas le rapport avec le rafraichissement du canevas qui se fait.
    Et pourtant avec la même fonction sans "lambda" le rafraichissement du canevas ne se fait pas.

    https://python.developpez.com/cours/..._functions.php

  5. #5
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    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 : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    La fonction lambda dans le code ne sert qu'à passer des arguments à la fonction appellée par after()... Je l'ai mis afin de te montrer comment on passe un argument à la fonction appelée par after(). Considére ça comme un bonnus .

    ...
    Le but était de te montrer comment ecrire avec after() un code non blocant (qui donc n'utilise pas update(), dont l'utilisation abusive témoigne d'un code mal écrit )

  6. #6
    Membre confirmé
    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
    Par défaut
    Bonjour à tous,
    Merci pour la réponse

    Citation Envoyé par Hominidé Voir le message
    Bonjour,
    La fonction lambda dans le code ne sert qu'à passer des arguments à la fonction appellée par after()... Je l'ai mis afin de te montrer comment on passe un argument à la fonction appelée par after(). Considére ça comme un bonnus .
    Oui ça je comprends et même d'autres particularités de la fonction.
    Mais ça ne m'explique toujours pas pourquoi l'utilisation d'une fonction anonyme rafraichi le canevas !!!


    Citation Envoyé par Hominidé Voir le message
    Le but était de te montrer comment ecrire avec after() un code non blocant (qui donc n'utilise pas update(), dont l'utilisation abusive témoigne d'un code mal écrit )

    Code avec Lambda le canevas est actualisé
    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 *
     
    window = Tk()
    window.geometry("480x360")
    can1 = Canvas(window, bg='dark grey', height=330, width=440)
    can1.pack(expand="YES")
     
    ampoule1 = can1.create_oval(30, 30, 90, 90, width=4, fill='grey')
    ampoule2 = can1.create_oval(30, 110, 90, 170, width=4, fill='grey')
     
     
    def action(ampoule, fill):
        can1.itemconfigure(ampoule, fill=fill)
     
     
    can1.after(1000, lambda: action(ampoule1, 'red'))
    can1.after(2000, lambda: action(ampoule2, 'red'))
     
    window.mainloop()
    Code sans Lambda le canevas n'est pas actualisé
    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
    from tkinter import *
    window = Tk()
    window.geometry("480x360")
    can1 = Canvas(window, bg='dark grey', height=330, width=440)
    can1.pack(expand="YES")
     
    ampoule1 = can1.create_oval(30, 30, 90, 90, width=4, fill='grey')
    ampoule2 = can1.create_oval(30, 110, 90, 170, width=4, fill='grey')
     
     
    def action(ampoule, fill):
        can1.itemconfigure(ampoule, fill=fill)
     
     
    can1.after(1000, action(ampoule1, 'red'))
    can1.after(2000, action(ampoule2, 'red'))
     
    window.mainloop()

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

Discussions similaires

  1. [Python 3.X] Tkinter / affichage d'une image dans un canevas
    Par willy31 dans le forum GUI
    Réponses: 5
    Dernier message: 02/01/2018, 08h06
  2. Réponses: 2
    Dernier message: 28/07/2006, 14h29
  3. Réponses: 9
    Dernier message: 02/02/2005, 15h52
  4. affichage dans le front buffers ne marche pas!
    Par jamal24 dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/08/2003, 19h14
  5. Texte dans un canevas
    Par Bernard M dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2002, 17h56

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