import tkinter as tk
import time
window=tk.Tk()
window.title("timer")
window.geometry("640x400+100+100")
setting = tk.Frame(window)
counter = tk.Frame(window)
setting.place(relx=0, rely=0, relwidth=1, relheight=1)
counter.place(relx=0, rely=0, relwidth=1, relheight=1)
setting.tkraise()
#show set
set_hmc = 0
def setcount_up():
global set_hmc
set_hmc += 1
set.config(text=set_hmc)
def setcount_down():
global set_hmc
if set_hmc != 0:
set_hmc -= 1
set.config(text=set_hmc)
set_exp = tk.Label(setting, text="set", width=10, height=5)
set = tk.Label(setting, text=set_hmc, width=10, height=5)
set_up = tk.Button(setting, text="+", command=setcount_up)
set_down = tk.Button(setting, text="-", command=setcount_down)
set_exp.place(x=320,y=50)
set.place(x=320,y=100)
set_up.place(x=50,y=100)
set_down.place(x=590,y=100)
#show exercise time
exz_sec = 0
def exzcount_up():
global exz_sec
global exz_hmc
exz_sec += 1
exz_hmc = f'{exz_sec//60:02d}:{exz_sec%60:02d}'
exz.config(text=exz_hmc)
def exzcount_down():
global exz_sec
global exz_hmc
if exz_sec != 0:
exz_sec -= 1
exz_hmc = f'{exz_sec//60:02d}:{exz_sec%60:02d}'
exz.config(text=exz_hmc)
exz_hmc = f'{exz_sec//60}:{exz_sec%60}'
exz_exp = tk.Label(setting, text="exercise", width=10, height=5)
exz = tk.Label(setting, text=exz_hmc, width=10, height=5)
exz_up = tk.Button(setting, text="+", command=exzcount_up)
exz_down = tk.Button(setting, text="-", command=exzcount_down)
exz_exp.place(x=320,y=150)
exz.place(x=320,y=200)
exz_up.place(x=50,y=200)
exz_down.place(x=590,y=200)
#show rest time
rest_sec = 0
rest_hmc = f'{rest_sec//60}:{rest_sec%60}'
def restcount_up():
global rest_sec
global rest_hmc
rest_sec += 1
rest_hmc = f'{rest_sec//60:02d}:{rest_sec%60:02d}'
rest.config(text=rest_hmc)
def restcount_down():
global rest_sec
global rest_hmc
if rest_sec != 0:
rest_sec -= 1
rest_hmc = f'{rest_sec//60:02d}:{rest_sec%60:02d}'
rest.config(text=rest_hmc)
rest_exp = tk.Label(setting, text="rest", width=10, height=5)
rest = tk.Label(setting, text=rest_hmc, width=10, height=5)
rest_up = tk.Button(setting, text="+", command=restcount_up)
rest_down = tk.Button(setting, text="-", command=restcount_down)
rest_exp.place(x=320,y=250)
rest.place(x=320,y=300)
rest_up.place(x=50,y=300)
rest_down.place(x=590,y=300)
#execute button
def execute():
counter.tkraise()
counting()
exct = tk.Button(setting, text="execute", command=execute)
exct.place(x=320,y=350)
###############################################counting time by counter##########################################
set_count = set_hmc
cur = 5
cur_set = tk.Label(counter, text=set_count, width=10, height=5)
cur_what = tk.Label(counter, text='ready', width=10, height=5)
cur_time = tk.Label(counter, text=f'{cur//60}:{cur%60}', width=10, height=5)
cur_set.place(x=320,y=50)
cur_what.place(x=320,y=100)
cur_time.place(x=320,y=200)
def counting():
global set_count
global cur
while set_count != 0:
cur_set.config(text=set_count)
if set_count == set_hmc: #give user time to get ready on first set
countdown()
cur = exz_sec
cur_what.config(text='exercise')
countdown()
cur = rest_sec
cur_what.config(text='rest')
countdown()
set_count -= 1
if set_count == 0:
setting.tkraise()
def countdown():
global cur
if cur > 0:
cur_time.config(text=f'{cur//60:02d}:{cur%60:02d}')
cur -= 1
window.after(1000, countdown)
window.mainloop()
我正在使用 tkinter 和 python 制作间隔计时器。但是当我运行代码时,使用 after 方法的时间循环不起作用。时间没有流逝,数字停留在00:05。另外,无论我写什么,集合数都会变成0。
当我改变时:
set.config(text=set_hmc)
和
set = tk.Label(setting, text=set_hmc, width=10, height=5)
至:
set_var.set(exz_hmc)
和
set = tk.Label(setting, textvariable=set_var, width=10, height=5)
同样在
exz
和休息上,在第二帧上设置数字正常显示,但时间也没有过去。
您面临的问题是由于在计数函数中使用了 while 循环。 while 循环不允许 Tkinter 主循环继续处理事件,因此 GUI 变得无响应。
您可以使用 after 方法来定期安排倒计时功能,而不是使用 while 循环。
import tkinter as tk
window = tk.Tk()
window.title("timer")
window.geometry("640x400+100+100")
setting = tk.Frame(window)
counter = tk.Frame(window)
setting.place(relx=0, rely=0, relwidth=1, relheight=1)
counter.place(relx=0, rely=0, relwidth=1, relheight=1)
setting.tkraise()
# show set
set_hmc = 0
def setcount_up():
global set_hmc
set_hmc += 1
set_var.set(set_hmc)
def setcount_down():
global set_hmc
if set_hmc != 0:
set_hmc -= 1
set_var.set(set_hmc)
set_exp = tk.Label(setting, text="set", width=10, height=5)
set_var = tk.StringVar()
set_var.set(set_hmc)
set = tk.Label(setting, textvariable=set_var, width=10, height=5)
set_up = tk.Button(setting, text="+", command=setcount_up)
set_down = tk.Button(setting, text="-", command=setcount_down)
set_exp.place(x=320, y=50)
set.place(x=320, y=100)
set_up.place(x=50, y=100)
set_down.place(x=590, y=100)
# show exercise time
exz_sec = 0
def exzcount_up():
global exz_sec
exz_sec += 1
exz_var.set(f'{exz_sec//60:02d}:{exz_sec%60:02d}')
def exzcount_down():
global exz_sec
if exz_sec != 0:
exz_sec -= 1
exz_var.set(f'{exz_sec//60:02d}:{exz_sec%60:02d}')
exz_var = tk.StringVar()
exz_var.set(f'{exz_sec//60:02d}:{exz_sec%60:02d}')
exz_exp = tk.Label(setting, text="exercise", width=10, height=5)
exz = tk.Label(setting, textvariable=exz_var, width=10, height=5)
exz_up = tk.Button(setting, text="+", command=exzcount_up)
exz_down = tk.Button(setting, text="-", command=exzcount_down)
exz_exp.place(x=320, y=150)
exz.place(x=320, y=200)
exz_up.place(x=50, y=200)
exz_down.place(x=590, y=200)
# show rest time
rest_sec = 0
def restcount_up():
global rest_sec
rest_sec += 1
rest_var.set(f'{rest_sec//60:02d}:{rest_sec%60:02d}')
def restcount_down():
global rest_sec
if rest_sec != 0:
rest_sec -= 1
rest_var.set(f'{rest_sec//60:02d}:{rest_sec%60:02d}')
rest_var = tk.StringVar()
rest_var.set(f'{rest_sec//60:02d}:{rest_sec%60:02d}')
rest_exp = tk.Label(setting, text="rest", width=10, height=5)
rest = tk.Label(setting, textvariable=rest_var, width=10, height=5)
rest_up = tk.Button(setting, text="+", command=restcount_up)
rest_down = tk.Button(setting, text="-", command=restcount_down)
rest_exp.place(x=320, y=250)
rest.place(x=320, y=300)
rest_up.place(x=50, y=300)
rest_down.place(x=590, y=300)
# execute button
def execute():
counter.tkraise()
counting()
exct = tk.Button(setting, text="execute", command=execute)
exct.place(x=320, y=350)
############################################### counting time by counter##########################################
set_count = set_hmc
cur = 5
cur_set = tk.Label(counter, textvariable=set_var, width=10, height=5)
cur_what = tk.Label(counter, text='ready', width=10, height=5)
cur_time = tk.Label(counter, text=f'{cur//60:02d}:{cur%60:02d}', width=10, height=5)
cur_set.place(x=320, y=50)
cur_what.place(x=320, y=100)
cur_time.place(x=320, y=200)
def counting():
global set_count
global cur
if set_count > 0:
cur_set.config(text=set_count)
if set_count == set_hmc: # give user time to get ready on the first set
countdown()
cur = exz_sec
cur_what.config(text='exercise')
countdown()
cur = rest_sec
cur_what.config(text='rest')
countdown()
set_count -= 1
window.after(1000, counting) # schedule the counting function after 1000 milliseconds
if set_count == 0:
setting.tkraise()
def countdown():
global cur
if cur > 0:
cur_time.config(text=f'{cur//60:02d}:{cur%60:02d}')
cur -= 1
window.after(1000, countdown)
window.mainloop()