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

Python Discussion :

Tkinter Canvas itemconfigure


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut Tkinter Canvas itemconfigure
    bonjour ,

    Je débute avec Tkinter , et je veux faire varier une data de température ( après acquisition ) .

    Comment avec une boucle while renouveler , un champs , toutes les 30 secondes avec sleep ?

    a / Dans la class Application(Tk):

    b / Ou après __name__ == '__main__':

    Mon code est le suivant :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    from Tkinter import *
    from tkSimpleDialog import Dialog
    from time import sleep
    import threading
    import random
     
    class AnimThread(threading.Thread):
     
        def __init__(self,canvas):
            threading.Thread.__init__(self)
     
            self.canvas=canvas
            self.item=self.canvas.create_text(300,350,fill="red",text="TEMPÉRATURE",font=("Times", "42", "bold italic") )
            self.item=self.canvas.create_text(300,100,fill="red",text="DEGRÉ : °C",font=("Times", "42", "bold italic") )
            self.item=self.canvas.create_text(300,500,fill="blue",text=int(25* random.random()),font=("Times", "62", "bold italic") )
     
            self.item=self.canvas.create_oval(280,200,330,250,fill="blue" )
     
        def run(self):
            self.anim=True
            state=0
            while(self.anim):
                state=[1,0][state]
                self.canvas.itemconfigure(self.item,state=[HIDDEN,NORMAL][state])
                self.canvas.update_idletasks()
                sleep(.2)
     
        def stop(self):
            self.anim=False
     
    class AnimWidget(Canvas):
     
        def __init__(self,master):
            Canvas.__init__(self,master=master,bd=1,width=600,height=600)
     
            self.thread=AnimThread(self)
     
            self.start()
     
        def start(self):
            """start the thread"""
            self.thread.start()
     
        def stop(self):
            """stop the thread"""
            self.thread.stop()
            while(self.thread.isAlive()):
                pass
            self.thread=None
     
    class MyDialog(Dialog):
     
        def __init__(self,master):
            Dialog.__init__(self,parent=master,title="titre" )
     
        def cancel(self, event=None):
            self.anim.stop()
            Dialog.cancel(self,event)
     
        def body(self, master):
            self.anim=AnimWidget(master)
            self.anim.pack()
     
    class Application(Tk):
     
        def __init__(self):
            Tk.__init__(self)
     
            self.mainframe=self
     
            self.anim=AnimWidget(self)
            self.anim.pack()
     
            self.btn=Button(self,text="dlg",command=self.opendialog)
            self.btn.pack()
     
        def opendialog(self):
            dlg=MyDialog(self)
     
     
    if __name__ == '__main__':
        app = Application()  
        app.mainloop()

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

    La première question serait "Faut-il sauver le soldat Ryan?".
    Je ne dis pas cela pour vous fâcher. Vous dites débuter avec Tkinter, votre code montre que vous ne débutez pas en Python. Et en plus il semble agréable a lire: bravo, c'est rare!
    Par contre pourquoi "pousser" une s/classe d'un Canvas dans une thread différente de celle de l'/application/ Tk?
    C'est peut etre un raccourci pour satisfaire:
    Comment avec une boucle while renouveler , un champs , toutes les 30 secondes avec sleep ?
    Avec un GUI (et pas que Tk), on poste un callback avec paramètres dans la pile d’événement - regardez les méthodes .after* dont heritent tous les widgets -.
    .after tout court prend (delay, callback, *args) en paramètre.
    Ca retourne un ID qui permettra un .after_cancel.
    Pourquoi se compliquer la vie avec des "threads" (au moins dans ce cas la)?
    - W
    PS: Pour le code, vous avez de quoi vous balader dans la doc. On vous aidera si vous jetez l’éponge.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    Avec un GUI (et pas que Tk)
    Je débute et ne voit pas encore , ce qui s'emboite dans un canvas .
    Ce qui rend le widget fixe ou variable .
    Le thread , fait clignoter le cercle . C'était le script du canvas , et j'ai ajouté
    après ' canvas.create_text ' .

    Les item forment une pile , et les méthode de python lisent des tuples .
    Je n'ai pas tout écrit . Un thread fait clignoter , alors pourquoi pas ,
    un autre pour faire varier le champ text .

    text=int(25* random.random())

    Avec :

    from vari import * # vari.py est le script d'acquisition de la température
    ..
    text=read_varia() # le champs texte peut lire une fonction

    Mais ensuite , comment relire le contenu de la fenêtre avec , cette fonction variable ?

    - faut il initialiser toute la fenêtre ?
    - faut il créer une fonction spécifique .
    - ou prolonger avec .after et comment ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    La mention:
    Citation Envoyé par bm Voir le message
    from vari import * # vari.py est le script d'acquisition de la température
    me fait supposer que la température sera rafraîchie toutes les n secondes: ca pourquoi pas le pousser dans 1 thread.

    Les methodes du canvas doivent etre appelee dans le contexte de la thread "principale" (et aussi via un .after_*)
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        def run(self):
            self.anim=True  
            state=0
            # short cuts
            post_event = self.canvas.after_idle
            itemconfigure = self.canvas.itemconfigure
     
            while(self.anim):
                state=[1,0][state] #?@?@?
    #            self.canvas.itemconfigure(self.item,state=[HIDDEN,NORMAL][state])
    #           self.canvas.update_idletasks()
               post_event (itemconfigure, self.item,state=...)
               sleep(.2)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    ok - je ne veux pas rafraichir l'acquisition de température à la vitesse
    du thread clignotant (0.2)

    J'ai trouvé ceci pour raffraichir le canvas toutes les 10 secondes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    self.item[3]=self.canvas.create_text(300,500,fill="blue",text=int(25* random.random()),font=("Times", "62", "bold italic") )
     
     def loop(self.item[3]):
            self.refresh()
            self.after(10,self.loop)
    def loop(self.item[3]):
    ^
    SyntaxError: invalid syntax

    Dans un premier temps , je veux rafraichir le champs text , avec un nombre aléatoire .
    La méthode sera ensuite identique , avec appel d'une fonction d'acquisition de ta température d'un capteur .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     def loop(self):
            self.refresh(5,self.item3)
    Est sans erreur , mais n'agit pas sur item3

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    .create_text empile un item a la même position.
    Il ne modifie pas l'item existant.
    Pour le reste:
    def loop(self.item[3]):
    ^
    SyntaxError: invalid syntax
    Repetez 20 fois:
    • Python est un langage de blocs.
    • Les lignes d'un bloc commencent a la même colonne.


    self.refresh? Je comprends le "concept" mais montrez le code!

    - 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. Text vertical dans Tkinter canvas text
    Par jcgarreau dans le forum Tkinter
    Réponses: 4
    Dernier message: 15/08/2009, 00h29
  2. [Tkinter][canvas]propriete d'un cnvas existant
    Par duplo dans le forum Tkinter
    Réponses: 4
    Dernier message: 18/10/2006, 20h04
  3. [Tkinter][canvas]trouver un objet
    Par duplo dans le forum Tkinter
    Réponses: 4
    Dernier message: 11/10/2006, 15h24
  4. [Tkinter].... Canvas: effacer un objet
    Par airod dans le forum Tkinter
    Réponses: 1
    Dernier message: 23/01/2006, 12h55
  5. [Tkinter] Canvas -> superposition et z-index ?
    Par Olivier_ dans le forum Tkinter
    Réponses: 3
    Dernier message: 02/12/2005, 09h05

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