使用“after”方法的循环没有运行,又出现了问题

问题描述 投票:0回答:1
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
和休息上,在第二帧上设置数字正常显示,但时间也没有过去。

python user-interface tkinter time
1个回答
1
投票

您面临的问题是由于在计数函数中使用了 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()
© www.soinside.com 2019 - 2024. All rights reserved.