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 :

Afficher une valeur en temps réel avec tkinter


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai

    Femme Profil pro
    Ingénieur validation
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 10
    Points
    10
    Billets dans le blog
    1
    Par défaut Afficher une valeur en temps réel avec tkinter
    Bonjour,

    j'utilise le programme suivant pour récupérer des données JSON sur un server, et je souhaite afficher une valeur spécifique (que j'appelle tata dans mon programme)qui va se mettre à jour toutes les secondes (je recois un JSON toutes les secondes). ci dessous le programme qui lit le nouveau JSON en boucle. Tkinter étant également une loop, je suis un peu perdu de la manière de procéder pour avoir un affichage correct. Je sais créer une fenetre et afficher une valeur avec tkinter, mais je ne sais pas ou placer mon programme pour que l'affichage soit correct ! par avance merci pour votre aide.
    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
     
    #!/usr/bin/env python3
    """
    Very simple HTTP server in python for logging requests
    Usage::
        ./server.py [<port>]
    """
    from http.server import BaseHTTPRequestHandler, HTTPServer
    import logging
    import json
    import tkinter as Tk
     
    tata = 0
     
    class S(BaseHTTPRequestHandler):
        def _set_response(self):
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
     
        def do_GET(self):
            logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
            self._set_response()
            self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))
     
        def do_POST(self):
            content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
            post_data = self.rfile.read(content_length) # <--- Gets the data itself
     
            logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n",
                    str(self.path), str(self.headers), post_data.decode('utf-8'))
     
            self._set_response()
            self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
            #print(post_data)
            # print(type(post_data))
            # Decode UTF-8 bytes to Unicode, and convert single quotes
            # to double quotes to make it valid JSON
            my_json = post_data.decode('utf8').replace("'", '"')
     
            # Load the JSON to a Python list & dump it back out as formatted JSON
            titi = json.loads(my_json)
            # s = json.dumps(data, indent=4, sort_keys=True)
            # print(titi)
            # print(type(titi))
     
            toto = titi["eulers"]
            # print(toto)
            # print(type(toto))
     
            premier = toto[0]
            print(premier["yawLeftForearm"])
            tata = premier["yawLeftForearm"]
            root = Tk.Tk()
            lbl = Tk.Label(text=0)
            lbl.config(text=str(tata))
            root.update()
            lbl.pack()
            root.mainloop()
     
     
     
    def run(server_class=HTTPServer, handler_class=S, port=8086):
        logging.basicConfig(level=logging.INFO)
        server_address = ('192.168.0.12', port)
        httpd = server_class(server_address, handler_class)
        logging.info('Starting httpd...\n')
        try:
     
            httpd.serve_forever()
        except KeyboardInterrupt:
            pass
        httpd.server_close()
        logging.info('Stopping httpd...\n')
     
    if __name__ == '__main__':
        from sys import argv
     
        if len(argv) == 2:
            run(port=int(argv[1]))
        else:
            run()

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

    Citation Envoyé par ciramor44 Voir le message
    mais je ne sais pas ou placer mon programme pour que l'affichage soit correct ! par avance merci pour votre aide.
    Normalement, on pousse le programme qui récupère les données dans un thread (parce que c'est un accès réseau qui peut durer) et on effectue une mise à jour de l'interface via .after.

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

  3. #3
    Membre à l'essai

    Femme Profil pro
    Ingénieur validation
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 10
    Points
    10
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Normalement, on pousse le programme qui récupère les données dans un thread (parce que c'est un accès réseau qui peut durer) et on effectue une mise à jour de l'interface via .after.

    - W
    Bonjour wiztricks,

    merci pour ton feedback !
    je suis débutant dans le monde de Python, j'ai pu regarder les threads et ca semble effectivement la solution à mon probleme. Cependant, je suis un peu dépassé vu mon faible niveau en Python. Comment je peux créer le thread pour la partie récupération des données et un thread pour l'affichage des données dans mon cas ?

    merci

  4. #4
    Membre à l'essai

    Femme Profil pro
    Ingénieur validation
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 10
    Points
    10
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ciramor44 Voir le message
    Bonjour wiztricks,

    merci pour ton feedback !
    je suis débutant dans le monde de Python, j'ai pu regarder les threads et ca semble effectivement la solution à mon probleme. Cependant, je suis un peu dépassé vu mon faible niveau en Python. Comment je peux créer le thread pour la partie récupération des données et un thread pour l'affichage des données dans mon cas ?

    merci
    Bon, j'ai finalement trouvé comment faire les threads :-), mes données sont toujours collectées toutes les secondes, l'affichage est mieux (pas 36 fenetres qui s'ouvrent) mais la valeur que je collecte n'est pas mise à jour dans mon affichage. j'ai du declarer ma données "tata" comme une variable globale, mais il semble qu'elle ne soit pas mise à jour :-(. En fait, dans mon do_POST, mon tata n'est pas reconnu comme la variable globale et je ne sais vraiment pas comment retourner cette donnée vu que le do_POST n'est pas une fonction que j'appelle dans mon programme. Quelqu'un a une idée ?

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    #!/usr/bin/env python3
    """
    Very simple HTTP server in python for logging requests
    Usage::
        ./server.py [<port>]
    """
    from http.server import BaseHTTPRequestHandler, HTTPServer
    import logging
    import json
    import tkinter as Tk
    import threading
     
    # The simple function that will simply print hello world and
    # the thread that is executing this
    global tata
    tata = 0
     
     
    class S(BaseHTTPRequestHandler):
        def _set_response(self):
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
     
        def do_GET(self):
            logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
            self._set_response()
            self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))
     
        def do_POST(self):
            content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
            post_data = self.rfile.read(content_length) # <--- Gets the data itself
     
            logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n",
                    str(self.path), str(self.headers), post_data.decode('utf-8'))
     
            self._set_response()
            self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
            #print(post_data)
            # print(type(post_data))
            # Decode UTF-8 bytes to Unicode, and convert single quotes
            # to double quotes to make it valid JSON
            my_json = post_data.decode('utf8').replace("'", '"')
     
            # Load the JSON to a Python list & dump it back out as formatted JSON
            titi = json.loads(my_json)
            # s = json.dumps(data, indent=4, sort_keys=True)
            # print(titi)
            # print(type(titi))
     
            toto = titi["eulers"]
            # print(toto)
            # print(type(toto))
     
            premier = toto[0]
            print(premier["yawLeftForearm"])
            tata = premier["yawLeftForearm"]
     
     
     
            #root.mainloop()
     
     
     
    def run(server_class=HTTPServer, handler_class=S, port=8086):
        logging.basicConfig(level=logging.INFO)
        server_address = ('192.168.0.12', port)
        httpd = server_class(server_address, handler_class)
        logging.info('Starting httpd...\n')
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            pass
        httpd.server_close()
        logging.info('Stopping httpd...\n')
     
    def collecte():
        from sys import argv
     
        if len(argv) == 2:
            run(port=int(argv[1]))
        else:
            run()
     
    def affichage():
        root = Tk.Tk()
        lbl = Tk.Label(text=0)
        lbl.config(text=str(tata))
        root.update()
        lbl.pack()
        root.mainloop()
     
     
     
    if __name__ == '__main__':
        th1 = threading.Thread(target=collecte)
        th2 = threading.Thread(target=affichage)
     
        th1.start()
        th2.start()
     
        th1.join()
        th2.join()

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

    Je ne comprends pas comment vous bossez!
    Quand je dois intégrer une mécanique compliquée dans un code, je prends le temps de décortiquer la mécanique à part. Ici, c'est écrire quelques lignes de 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
    import tkinter as tk
    import time
    import threading
     
    def do_update(label, done):
        count = 0
        while not done.is_set():
            count += 1
            label.after_idle(lambda: label.configure(text =count))
            time.sleep(0.1)
     
    root = tk.Tk()
    label = tk.Label(root)
    label.pack()
     
    done =threading.Event()
    t = threading.Thread(target=do_update, args=(label, done), daemon=1)
    t.start()
    tk.mainloop()
    done.set()
    où on a un thread qui met à jour un Label.
    Ce que fait "précisément" le thread n'a qu'une importance que très relative comparée aux mécanismes à utiliser/maîtriser.

    Puis quand la mécanique est comprise, on peut envisager de l'intégrer à son code.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 18/03/2014, 17h17
  2. Comment afficher une valeur dans un edittext avec un autre programme
    Par pitizone dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 14/05/2007, 07h45
  3. Réponses: 1
    Dernier message: 31/10/2006, 11h15
  4. Afficher une variable en temps réel
    Par AraBorLeg dans le forum DirectX
    Réponses: 1
    Dernier message: 09/03/2006, 19h12
  5. Afficher une variable en temps réel
    Par AraBorLeg dans le forum Langage
    Réponses: 2
    Dernier message: 09/03/2006, 17h40

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