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 :

Rafraichissement du canvas [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Rafraichissement du canvas
    Bonjour !

    Mon problème est simple, je souhaite, entre autre dans mon GUI, afficher une valeur qui s'incrémente chaque seconde.

    Mais lors de l'affichage chaque nouvelles valeurs écrasent celles qui les ont précédées … Donc le 2 s'imprime sur le 1, le 3 sur le 2*qui est sur le 1 etc

    Comment y remédier ?

    En gros l'entièreté de mon programme pour le moment c'est un arc de cercle qui augmente au fur et a mesure que la valeur augmente (comme une barre de progression), et la je voudrais juste afficher la valeur "compteur", au centre de la fenêtre. Pour après l'agrandir et y ajouter un "%" par exemple.

    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
    41
    42
    43
    44
    45
    46
    from tkinter import *
    import tkinter as tk
     
     
    hauteur = 1080
    largeur = 1080
     
     
    fenetre = Tk()
    canvas = Canvas(fenetre, width=largeur, height=hauteur, background='darkgrey')
    ligne1 = canvas.create_line((largeur/2), 0, (largeur/2), hauteur)
    ligne2 = canvas.create_line(0, (hauteur/2), largeur, (hauteur/2))
     
     
    compteur = 1
     
     
    def txt(compteur):
     
        canvas.create_arc((largeur / 4), (hauteur / 4), (3 * largeur / 4), (3 * hauteur / 4), start=90, extent=compteur, width=10,
                          fill="grey",style = ARC)
     
     
        if (compteur < 361):
            canvas.create_text(250, 250, text=compteur)
            fenetre.after(100,txt,compteur + 1)
     
     
     
    #Label(fenetre, textvariable=compteur).pack(padx=0, pady=0)
     
    def Cercle():
        """ Dessine un cercle de centre (x,y) et de rayon r """
        x = largeur/2
        y = hauteur/2
        r = 270
        canvas.create_oval(x-r, y-r, x+r, y+r, outline='#134355', fill="#134355")
     
     
    Cercle()
     
    txt(compteur)
     
    canvas.pack()
     
    fenetre.mainloop()
    Merci

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

    Citation Envoyé par weezixx Voir le message
    Mais lors de l'affichage chaque nouvelles valeurs écrasent celles qui les ont précédées … Donc le 2 s'imprime sur le 1, le 3 sur le 2*qui est sur le 1 etc
    .create_line, .create_text, .create_arc,... créent de nouveaux objets affichés dans le canvas. Ces objets sont appelés "items" et chaque appel à .create_XYZ retournera un identifiant qu'on pourra (par exemple) passer à canvas.delete(ident) pour le détruire ou à canvas.itemconfig(ident,....) pour le modifier,...

    Si vous vous lancez dans l'utilisation d'un widget aussi compliqué que le Canvas (Text est un joli morceau aussi), difficile de ne pas passer un peu de temps à essayer de lire une des documentations que vous trouverez ici et si vous n'avez pas peur de l'anglais (ou envie de le perfectionner), effbot ou encore mieux la documentation Tk officielle.

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Alors,

    ça avance, j'ai utilisé exactement le pattern de http://effbot.org/tkinterbook/canvas..._window-method, et pour m'entraîner j'essaie de changer la couleur d'un rectangle après 2 secondes.

    La couleur change mais … je ne le vois pas :/

    Çàd que c'est directement la 2e couleur qui s'affiche, même quand je met un sleep ou un after.

    Je ne met pas le code car j'ai tellement chipoté que je ne retrouve plus celui qui "fonctionne".

    Comment donc pendant qu'un rectangle "blue" est affiché dans le canvas, après 2 secondes et sans action de ma part, la couleur change en "green" ?

    Je réfléchis trop en séquentiel, et pas encore assez en événementiel je pense.

    Merci


    EDIT :

    Il suffit de parler du problème, de le mettre en prose pour qu'il … explose !

    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
    master = Tk()
     
    w = Canvas(master, width=200, height=100)
     
     
     
    def rectangle(color):
     
     
        i = w.create_rectangle(50, 25, 150, 75, fill=color)
     
        master.after(1000,rectangle,"blue")
     
     
    rectangle("green")
     
     
    w.pack()
     
    mainloop()
    Je reviens vers toi si mon premier problème est résolu

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

    Citation Envoyé par weezixx Voir le message
    Comment donc pendant qu'un rectangle "blue" est affiché dans le canvas, après 2 secondes et sans action de ma part, la couleur change en "green" ?
    C'est pas compliqué:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> import tkinter as tk
    >>> canvas = tk.Canvas()
    >>> canvas.pack()
    >>> iid = canvas.create_rectangle(50, 25, 150, 75, fill='red')
    >>> canvas.after(2000, lambda: canvas.itemconfig(iid, fill='blue'))
    'after#0'
    et si sortir ces quelques lignes est "compliqué", peut être que la lecture d'un tuto. qui présente comment utiliser tkinter dans différentes situations vous serait bénéfique.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    J'au juste rajouté : cercle() dans la fonction texte(), pour l'actualiser. Je dois encore comprendre pourquoi ça actualise car dans la fonction cercle il n'y a pas de compteur …

    Code final :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    from tkinter import *
    import tkinter as tk
    from time import *
     
     
    hauteur = 1080
    largeur = 1080
     
     
    fenetre = Tk()
    canvas = Canvas(fenetre, width=largeur, height=hauteur, background='darkgrey')
    ligne1 = canvas.create_line((largeur/2), 0, (largeur/2), hauteur)
    ligne2 = canvas.create_line(0, (hauteur/2), largeur, (hauteur/2))
     
    #Pour ne pas avoir la barre titre dans la fenêtre
    fenetre.overrideredirect(1)
     
    #transparence de la fenêtre
    fenetre.attributes("-alpha", 1.0)
     
    compteur = 1
     
    w = Canvas(fenetre,width = 250,height = 250)
     
     
     
    def txt(compteur):
     
        cercle()
     
        canvas.create_arc((largeur / 4), (hauteur / 4), (3 * largeur / 4), (3 * hauteur / 4), start=90, extent=compteur, width=10,
                          fill="grey",style = ARC)
     
        if compteur < 361:
            i = canvas.create_text(540, 540, text=(compteur,"%"),font=("Purisa", 26))
            fenetre.after(100,txt,compteur+1)
     
     
     
    def cercle():
        """ Dessine un cercle de centre (x,y) et de rayon r """
        x = largeur/2
        y = hauteur/2
        r = 270
        canvas.create_oval(x-r, y-r, x+r, y+r, outline='#134355', fill="#134355")
     
     
     
    #cercle()
     
    txt(compteur)
     
    canvas.pack()
     
    fenetre.mainloop()

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

    Citation Envoyé par weezixx Voir le message
    J'au juste rajouté : cercle() dans la fonction texte(), pour l'actualiser. Je dois encore comprendre pourquoi ça actualise car dans la fonction cercle il n'y a pas de compteur …
    Vous n'actualisez rien: vous masquez les anciens objets en créant de nouveaux objets par dessus.

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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Comment résoudre mon problème alors ?

    Car j'ai déjà trouvé les 101 façons de ne pas y arriver …

    Merci

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 235
    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 235
    Points : 36 684
    Points
    36 684
    Par défaut
    Citation Envoyé par weezixx Voir le message
    Comment résoudre mon problème alors ?

    Car j'ai déjà trouvé les 101 façons de ne pas y arriver …
    En utilisant la méthode .itemconfig...
    Çà ne fera que la 3ème fois que je vous le suggère.

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

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Oui je vous lis, mais la je demande si vous pourriez me donner la réponse car je ne trouve vraiment pas.

    Merci

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 235
    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 235
    Points : 36 684
    Points
    36 684
    Par défaut
    Citation Envoyé par weezixx Voir le message
    Oui je vous lis, mais la je demande si vous pourriez me donner la réponse car je ne trouve vraiment pas.
    Ce n'est pas un jeu de questions/réponses mais du temps à passer pour comprendre comment fonctionne un exemple comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import tkinter as tk
    >>> canvas = tk.Canvas()
    >>> canvas.pack()
    >>> iid = canvas.create_rectangle(50, 25, 150, 75, fill='red')
    >>> canvas.itemconfig(iid, fill='blue')
    (que je vous ai donné il y a déjà 10 jours).
    Modifier votre programme pour qu'il utilise .itemconfig, c'est juste créer les items en stockant les identifiants retournés par les .create_{items} dans des variables globales et les mettre à jour dans votre fonction "txt" en utilisant .itemconfig.

    Si c'est trop compliqué pour vous, ben... il faut passer plus de temps à comprendre les bases plutôt que de vouloir utiliser tkinter trop vite (et en être réduit à demander qu'on écrive le code à votre place dans différents forums).

    - 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. Rafraichissement d'un canvas
    Par bobkilla dans le forum SWT/JFace
    Réponses: 5
    Dernier message: 30/05/2008, 11h12
  2. Timage et Canvas??
    Par vanack dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2007, 12h38
  3. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 19h07
  4. Timage rafraichissment
    Par Rizzla dans le forum Composants VCL
    Réponses: 5
    Dernier message: 16/09/2002, 18h08
  5. Réponses: 2
    Dernier message: 17/05/2002, 21h37

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