Search code examples
pythontkintertimetreeview

How to find time difference between 2 log data in python and adding in tkinter treeview


on clicling submit button data gets added to tree with current time

from tkinter import Tk, Frame, Button, Label, Entry, ttk, StringVar, messagebox
import datetime

# Main Window
class WINDOW(Tk):
    def __init__(self, master):
        Tk.__init__(self, master)
        self.master = master

        frame1 = Frame1(self)
        frame1.grid(row=0,column=0)

class Frame1(Frame):
    def __init__(self, master):
        Frame.__init__(self, master,height=master.winfo_screenheight(),
                       width=master.winfo_screenwidth())
        self.master = master

        var = StringVar()
        label = Label(self, text="DATA", font=('calibre', 10, 'bold'))
        entry = Entry(self, textvariable=var,width=10, font=('calibre', 10, 'normal'))
        label.grid(row=0, column=1)
        entry.grid(row=1, column=1)

        # Log data sheet
        NewTree = ttk.Treeview(self, height=23, columns=("Time","Time Diff", "DATA"))
        NewTree['show'] = 'headings'
        NewTree['columns'] = ("Time","Time Diff", "DATA")

        NewTree.column("Time", width=180)
        NewTree.column("Time Diff", width=150)
        NewTree.column("DATA", width=150)

        NewTree.heading("Time",text='TIME')
        NewTree.heading("Time Diff",text='TimeDIfference')
        NewTree.heading("DATA",text='DATA')


        NewTree.grid(row=5, columnspan=4)

        def insert_data():
            if entry.get()=='':
                messagebox.showerror("","Please insert data")
            else:
                NewTree.insert('', 'end',values=(datetime.datetime.now(),"",entry.get()))
                entry.delete(0, 'end')


        submit_button = Button(self, text="SUBMIT", command=insert_data)
        submit_button.grid(row=3, column=4)

root = WINDOW(None)
root.geometry(f'{root.winfo_screenwidth()}x{root.winfo_screenheight()}')
root.title("ADD DATA")
root.mainloop()

Please refer the image: there is time difference between submitting the 11 and 12, 12 and 24 and so on. i need to calculate that time and want to add in time difference column.

it is like how much time it takes to add next data


Solution

  • I am not quite sure with what you are comparing the value, but my guess is the previous time.

    you can use relativedelta to get the time difference.

    In the beginning, assign both currenttime = previoustime = datetime.datetime.now(). Then when ever the user calls update again assign currenttime=datetime.datetime.now() find the time difference, display the data in the treeview and then update previoustime=currenttime

    Here is an example.

    from tkinter import ttk,Tk
    import datetime
    from dateutil.relativedelta import relativedelta
    
    def diff(t_a, t_b):
        t_diff = relativedelta(t_b, t_a) 
        return '  {h}h {m}m {s}s {ms}ms'.format(h=abs(t_diff.hours), m=abs(t_diff.minutes), s=abs(t_diff.seconds), ms=abs(round(t_diff.microseconds*0.001, 2)))
    
    def update():
        global currenttime, previoustime, timediff
    
        currenttime= datetime.datetime.now()
        timediff = diff(currenttime, previoustime)
        
        curr = tree.insert('','end',values=(currenttime,timediff))
        previoustime = currenttime
        tree.selection_set(curr)
        tree.see(curr)
        
    root = Tk()
    tree = ttk.Treeview(root, height = 20, columns = 2)
    tree['show']='headings'
    tree['columns'] = ('one','two')
    tree.column('one', width = 250)
    tree.column('two', width = 250)
    tree.heading('one', text = 'TIME')
    tree.heading('two', text = 'TIME Difference')
    tree.grid(row = 0, column = 0)
    
    currenttime= datetime.datetime.now()
    previoustime= currenttime
    
    timeBtn = ttk.Button(root, text='Update', command=update)
    timeBtn.grid(row=1, column=0)
    
    root.geometry("500x500")
    root.mainloop()
    
    

    Update after OP's request:

    class Frame1(Frame):
        def __init__(self, master):
            ...
            NewTree.grid(row=5, columnspan=4)
            
            self.currenttime = None
            self.previoustime = None
            self.timediff = None
    
    
            def diff(t_a, t_b):
                t_diff = relativedelta(t_b, t_a) 
                return '  {h}h {m}m {s}s {ms}ms'.format(h=abs(t_diff.hours), m=abs(t_diff.minutes), s=abs(t_diff.seconds), ms=abs(round(t_diff.microseconds*0.001, 2)))
    
            def update_time():
            
                if entry.get()=='':
                    messagebox.showerror("","Please insert data")
             
                else:
    
                    self.currenttime= datetime.datetime.now()
    
                    if self.previoustime is None:
                        self.previoustime = self.currenttime
                    
                    self.timediff = diff(self.currenttime, self.previoustime)
                    
                    curr = NewTree.insert('','end',values=(datetime.datetime.now(), self.timediff ,entry.get()))
                    self.previoustime = self.currenttime
                    NewTree.selection_set(curr)
                    NewTree.see(curr)
             
            submit_button = Button(self, text="SUBMIT", command=update_time) 
             ...