самый простой способ это использовать root.after(). Имейте в виду, что заданный период в методе root.after() не гарантирован для вызова функции по истечении указаного периода, если приложение занято, в результате того, что Tkinter является однопоточным.
пример :
#
from tkinter import *
import random
import time
t = 3000
a = 0
colors = ["blue", "red", "pink", "yellow", "orange", "green"]
start_time = 0
def timer_start():
global start_time
start_time = time.perf_counter_ns()
root.after(10, update_timer)
def ms_to_time(ms):
total_minuts = ms/1000
hours = int(total_minuts//60)
minutes = round(total_minuts%60)
return f'{hours}:{str(minutes).rjust(2, "0")}'
def update_timer():
global t, start_time
cur_time = time.perf_counter_ns()
time_delta = (cur_time - start_time)// 1000000 #ms
t = t - time_delta
if t <= 0:
root.destroy()
start_time = cur_time
lbl['text'] = ms_to_time(t)
root.after(10, update_timer)
def Peremechenie():
global a
global rnd
global t
a = a + 1
t = t + 3000
first = random.randint(100, 450)
second = random.randint(100, 450)
rnd = random.choice(colors)
btn.place(height="70", width="70", x=first, y=second)
btn.config(text=a, bg = rnd, fg = "black")
root = Tk()
root.title("Успей!")
root.geometry("700x500")
root.resizable(0,0)
btn = Button(text=a, command= Peremechenie, bg = "black", fg = "white")
lbl = Label(text=ms_to_time(t))
lbl.pack()
btn.place(height="70", width="70", x=300, y=200)
root.after(10, timer_start)
root.mainloop()
как альтернатива считать время в отдельном процессе/потоке.