Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
tkinter
#1
Hi

I want to display a value which is updated every second.
I receive data via an HTTP post every second
I try to use tkinter, by putting my program in the do_POST but the loop of tkinter doesn't allow to read next value via HTTP
I don't know how to display this value (tata in my program)!!
somebody can help me ?

thanks in advance for your support

regards

seb

#!/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
from tkinter import *

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

        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"]

        def maj():
        # on arrive ici toutes les 1000 ms
        #heure = str(random.randint(0, 10))
            donnees.set(str(tata))
            Mafenetre.after(1000,maj)

        Mafenetre = Tk()
        Mafenetre.title("Heure courante")

        # Creation d'un widget Label
        donnees = StringVar()
        Label(Mafenetre,textvariable=donnees).pack(padx=10,pady=10)

        maj()

        Mafenetre.mainloop()

        #print(premier)
        #print(type(premier))

        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'))

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()
Reply
#2
without digging into your code, I provide a simple polling example:
import tkinter as tk

class Polling:
    def __init__(self, parent):
        self.parent = parent

        self.parent.geometry('100x100+10+10')
        self.txt = tk.Text(parent)
        self.txt.pack(fill=tk.BOTH)
        self.toggle = True

    def myevent(self):
        # Note from Larz60+
        # you can add your own code here.
        # I'll just print message for simplicity
        if self.toggle:
            self.txt.insert(tk.END, 'tick\n')
            self.toggle = False
        else:
            self.txt.insert(tk.END, 'tock\n')
            self.toggle = True

    def poller(self):
        self.myevent()
        self.txt.after(2000, self.poller) # 2 seconds

def main():
    root = tk.Tk()
    poll = Polling(root)
    poll.poller()
    root.mainloop()

if __name__ == '__main__':
    main()
Reply
#3
Hello

thanks for your answer, actually it is my main problem, I have no idea how to insert the display part in my do_POST() !!
thanks in advance

regards
Reply
#4
I do show a display example in the myevent method, which uses a Text widget
Run the code, it just displays a simple tick tock every two seconds (slow ticker)
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020