I'm trying to learn how to use TKinter to make GUI for Python apps. I'm trying to create a Pomodoro timer, however I've encountered a couple of issues.
- I run
while
loop in another function to update label with time left - While in loop GUI unresponsive (that's OK)
- I've googled a little bit, went through some StackOverflow questions and I've found that this function running loop could be run in a separate thread.
This solved the first issue, but there is another
- Cancel button works, but I don't see the click animation.
- Timer does not stop immediately.
Can you kindly explain why this is happening and what I can do to increase the responsiveness of my GUI?
import time
import tkinter
import winsound
from tkinter.ttk import Combobox
import threading
def run_thread():
global stop
stop = False
start_timer_btn.grab_release()
threading.Thread(target=countdown()).start()
def stop_timer():
global stop
stop = True
def countdown():
option = combo.get()
if option == "25":
seconds = 1500
elif option == "15":
seconds = 900
# elif option == "2":
# countdown(300)
# elif option == "3":
# countdown(1200)
global stop
while seconds and not stop:
seconds -= 1
print("minutes", seconds // 60, "seconds", seconds % 60)
timer_label.configure(text=str(seconds // 60) + ":" + str(seconds % 60))
window.update()
time.sleep(1)
winsound.PlaySound("SystemExit", winsound.SND_ALIAS)
stop = False
window = tkinter.Tk()
window.title("POMODORO Timer")
window.geometry("300x250")
combo = tkinter.ttk.Combobox(window)
combo["values"] = [25, 15]
combo.current(1)
timer_label = tkinter.Label(window, text="00:00")
start_timer_btn = tkinter.Button(window, text="Start timer", bg="green", fg="white", command=run_thread)
stop_timer_btn = tkinter.Button(window, text="Stop timer", bg="red", fg="white", command=stop_timer)
combo.grid(row=1, column=0)
start_timer_btn.grid(row=1, column=1)
stop_timer_btn.grid(row=1, column=2)
timer_label.grid(row=0, column=2, columnspan=3)
window.mainloop()