Home > Mobile >  Python tkinter: Countdown Timer not accurate
Python tkinter: Countdown Timer not accurate

Time:05-25

I made a countdown timer using Tkinter in python, but my only problem is that one second in the timer is a bit longer than a real second.

I used the after() function to, every millisecond, remove one millisecond (0.001 second) from the clock.

I don't know if it's doing that because the code of the clock takes some extra time to execute, if that's the case how could I make a clock with the exact same UI that takes less time to execute?

Here's a Video showing the problem

The program:

from tkinter import *

class root(Tk):
    def __init__(self):
        super(root, self).__init__()

        self.title("Timer")
        
        self.buttonplay = Button(self, text = "Play", fg= 'green', command = self.play)
        self.buttonplay.pack()

        self.buttonpause = Button(self, text = "Pause", fg = "red", command=self.pause)
        self.buttonpause.pack()

        self.createTimers()

    def play(self):
        self.timeit=True
        self.timer1.configure(bg='#1C953D')
        self.doTimer()

    def pause(self):
        self.timeit=False
        self.timer1.configure(bg='#454545')
        
    def reset(self):
        self.timer1.destroy()
        self.createTimers()

    def createTimers(self):
        self.minute = 0
        self.second = 5
        self.ms = 0
        self.total = self.second   self.minute *60   self.ms*0.001
        self.time1 = StringVar()
        self.time1.set(str(self.minute).rjust(2, '0')   ':'   str(self.second).rjust(2, '0')  '.'  str(self.ms).rjust(3, '0'))
        self.timer1 = Label(self, textvariable=self.time1, bg='#454545', fg='white', font ="Gadugi 40 bold")
        self.timer1.pack()
        self.timer1.configure(bg='#454545')

    def doTimer(self):
        self.time = self.second   self.minute *60   self.ms*0.001
        if self.time !=0: #Checks if the timer ended
            if self.timeit:
                self.timer1.configure(bg='#1C953D')
                
                self.ms = self.ms -1
                if self.ms <0:
                    self.second = self.second -1
                    self.ms = 999

                if self.second == -1:
                    self.minute = self.minute -1
                    self.second = 59

                self.time1.set(str(self.minute).rjust(2, '0')   ':'   str(self.second).rjust(2, '0')  '.'  str(self.ms).rjust(3, '0'))
                
                if self.timeit:
                    self.after(1, self.doTimer)
        else:
            self.ended = 1
            self.timer1.configure(bg='#FF0000')
            self.after(3000, self.reset)


root = root()
root.mainloop()

CodePudding user response:

I don't know if it's doing that because the code of the clock takes some extra time to execute

In this case you are right, the tempo of your timer is dependent on the runtime of your code. So making this script require more resources from your computer would also slow down the timer, and vice versa.

"Don't reinvent the wheel." - Programming proverb.

Use the time module to get a more accurate time in your timer. More specifically time.time() and format it to make it readable.

  • Related