I am making a simple countdown timer in minutes. I can't seem to display the countdown in text label. Can someone help me?
import tkinter as tk
import timedef countdown(t):while t:mins, secs = divmod(t, 60)timeformat = '{:02d}:{:02d}'.format(mins, secs)print(timeformat, end='\r')label.config(text=timeformat)time.sleep(1)t -= 1root = tk.Tk()
label = tk.Label(root,text="Time")
label.pack()
button = tk.Button(root,text = "click here", command=countdown(60)).pack()root.mainloop()
First of all, instead of using this
button = tk.Button(root,text = "click here", command=countdown(60)).pack()
You have to use lambda
to specify arguments
button = tk.Button(root,text = "click here", command=lambda:countdown(60)).pack()
Then you have to update root
each time you update the label
def countdown(t):
while t:mins, secs = divmod(t, 60)timeformat = '{:02d}:{:02d}'.format(mins, secs)print(timeformat, end='\r')label.config(text=timeformat)root.update() #This way your program will display the numbers.time.sleep(1)t -= 1
Also I recommend to use Threads, to be able to use other buttons while your program is running.
Requested code:
import threading
import tkinter as tk
import time
import sysruntime = 300 #In seconds, you can change thisclass CountdownApp:def __init__(self, runtime):self.runtime = runtimeself._createApp()self._packElements()self._startApp()def _createApp(self):self.root = tk.Tk()def _packElements(self):self.label = tk.Label(self.root,text="Time")self.label.pack()self.button = tk.Button(self.root,text = "click here", command=self.startCounter)self.button.pack()def countdown(self):self.t = self.runtimeself.button.config(state='disabled')while self.t > -1:self.mins, self.secs = divmod(self.t, 60)self.timeformat = '{:02d}:{:02d}'.format(self.mins, self.secs)self.label.config(text=self.timeformat)self.root.update()time.sleep(1)self.t -= 1self.label.config(text='Time')self.root.update()self.button.config(state='normal')def startCounter(self):threading.Thread(target=self.countdown).start()def _startApp(self):self.root.mainloop()CountdownApp(runtime)