dragon123
dragon123

Reputation: 303

How to display some measured result in python tkinter GUi- new values every seconds

I am trying to measure some value with sensors and display it using python tkinter GUI. I managed to create a GUI and the program to measure. Now I want to display the data in the GUI and as I am getting new values every second I want to update the screen with new values. I have seen than I can use textvariable. But how to initialize this? when program start, as there is no any output in the beginning, it shows error. How to manage it. any suggestions please. finally how to update every second?

from tkinter import *
import tkinter.font
import numpy as np
import pigpio

win = Tk()
myFont = tkinter.font.Font(family = 'Verdana', size = 20, weight = 'bold')

win.geometry('800x480')
win.configure(background='#CD5C5C')

#------------------------------------------------------main program ----------------------------------#
def readSensors():
    #function body
    # output is a list with name measuredValues
    #measuredValues contains total 4 values as I have 4 sensors
    win.after(1000, readSensors)     #calling the function every second

#label names variable
output_1= StringVar()
output_2 = StringVar()
output_3 = StringVar()
output_4 = StringVar()

value0 = str(measuredValues[0])
value1= str(measuredValues[1])
value2 = str(measuredValues[2])
value3 = str(measuredValues[3])

output_1.set (value0)
output_2.set (value1)
output_3.set (value2)
output_4.set(value3)

#Labels
# i used textvariable to to measured values. but doesn't work so far
#display values
output_1_label = Label(win, textvariable = output_1,height =2, width = 12)
output_1_label.place(x=200, y=100)

output_2_label = Label(win, textvariable = output_2, height =2, width = 12)
output_2_label.place(x=200, y=200)

output_3_label = Label(win, textvariable = output_3,height =2, width = 12)
output_3_label.place(x=200, y=300)

output_4_label = Label(win, textvariable = output_4, height =2, width = 12)
output_4_label.place(x=200, y=400)

#how to update the window with new data?
win.after(1000, readSensor)
win.mainloop()

Upvotes: 0

Views: 1808

Answers (2)

Abon Denzieri
Abon Denzieri

Reputation: 1

You can use Classes to reach all the data from parent structure. You need to initilize a function to call another function with after tribute inside it first. It simply configures the data again and again after counting firstly 1000 ms and then 20 ms(adjust it to read data smoothly). You can add more dynamic data/text and use "after" tribute once, it will still be refreshing all of them. It is an event dependent solution which is significantly better than time dependent or loop based refreshing algorithms for data reading.

import time
from random import random
from random import seed
from tkinter import StringVar,Entry
import tkinter as tk

class GUI:

    #------------------INITIAL---------------------------------------------------------------------------------------------------------


    def __init__(self, parent):

        self.labelBackground = tk.Label(parent, text="",bg="white",width=1920,height=1080)
        self.labelBackground.place(x=0,y=0)
        self.labelDate = tk.Label(parent, text="Date",bg="white", font="Arial 20", width=100)
        self.labelDate.pack()
        self.labelDate.after(1000, self.refresh_label)

    def dateData(self):
        year,mon,day,hour,min,sec,a,b,c = time.localtime()
        infoDate = f"Date/Time: {year} {mon} {day} h:{hour} m:{min} s:{sec} "
        return f"Clock: {hour}:{min}:{sec} "      

    def refresh_label(self):
        self.seconds = self.dateData()
        self.labelDate.configure(text=self.seconds)
        self.labelDate.after(20, self.refresh_label)



if __name__ == "__main__":
    root = tk.Tk()
    root.geometry("1920x1080") #Window Resolution
    root.title("Insert_Window_Title")
    timer = GUI(root)
    root.mainloop()

Upvotes: 0

Reblochon Masque
Reblochon Masque

Reputation: 36732

You need to update the variables set as textvariables with the sensor values last read:

Something like this - the sensor readings were replaced with a randomly chosen value to simulate new data readings:

import tkinter as tk
import random


def readSensors():
    output_1.set(random.choice([0, 1, 2, 3, 4, 5]))
    output_2.set(random.choice([0, 1, 2, 3, 4, 5]))
    output_3.set(random.choice([0, 1, 2, 3, 4, 5]))
    output_4.set(random.choice([0, 1, 2, 3, 4, 5]))
    win.after(1000, readSensors)


win = tk.Tk()

win.geometry('800x480')
win.configure(background='#CD5C5C')

output_1 = tk.StringVar()
output_2 = tk.StringVar()
output_3 = tk.StringVar()
output_4 = tk.StringVar()

measuredValues = [0, 1, 2, 3, 4, 5]
value0 = str(measuredValues[0])
value1 = str(measuredValues[1])
value2 = str(measuredValues[2])
value3 = str(measuredValues[3])

output_1.set(value0)
output_2.set(value1)
output_3.set(value2)
output_4.set(value3)

output_1_label = tk.Label(win, textvariable=output_1, height=2, width=12)
output_1_label.place(x=200, y=100)

output_2_label = tk.Label(win, textvariable=output_2, height=2, width=12)
output_2_label.place(x=200, y=200)

output_3_label = tk.Label(win, textvariable=output_3, height=2, width=12)
output_3_label.place(x=200, y=300)

output_4_label = tk.Label(win, textvariable=output_4, height=2, width=12)
output_4_label.place(x=200, y=400)

win.after(1000, readSensors)
win.mainloop()

Upvotes: 1

Related Questions