Python tKinter - 有没有办法在进行新计数之前摆脱现有标签?

Python tKinter - Is there a way to get rid of existing label before making a new count-up?

我找到了一个倒计时代码并对其进行了修改,使其计数到给定的数字。一切正常,但每次我按下按钮 运行 功能时,现有标签会保留在那里,而新标签会放在最上面。 (如果我打包它们,它们会被放在彼此下面)。这是因为它们是在函数内部创建的,但我似乎找不到解决方法。

这可能是一个新手问题,但我只是想学习:)

代码:

import time
from tkinter import *
import threading

betongtrykk = Tk()
betongtrykk.geometry("400x300")

canvas = Canvas(
    betongtrykk,
    bg = "#FFFFFF",
    height = 300,
    width = 400,
    bd = 0,
    highlightthickness = 0,
    relief = "ridge"
)

canvas.place(x = 0, y = 0)

utnyttelseres = 65

def cd(timer_label_obj,ts):
    while ts < utnyttelseres:
        timer_label_obj.config(text=ts)
        ts+=1
        timer_label_obj.place(x=100, y=150)
        time.sleep(0.01)
        if ts == utnyttelseres:
            timer_label_obj.config(text=utnyttelseres)

def countup(t):
    timer = Label(betongtrykk)
    th = threading.Thread(target=cd,args=[timer,t])
    th.start()

submitCountdown = Button(betongtrykk, padx=5, pady=5, text="Submit", font=("Arial", 20), command= lambda:countup(0))
submitCountdown.place(x= 100, y=100)

betongtrykk.mainloop()

倒计时结束后,您可以在标签小部件上使用 <widget>.destroy() 方法。此方法将删除小部件并将其从屏幕上移除。

更正代码:

import time
from tkinter import *
import threading

betongtrykk = Tk()
betongtrykk.geometry("400x300")

canvas = Canvas(
    betongtrykk,
    bg = "#FFFFFF",
    height = 300,
    width = 400,
    bd = 0,
    highlightthickness = 0,
    relief = "ridge"
)

canvas.place(x = 0, y = 0)

utnyttelseres = 65

def cd(timer_label_obj,ts):
    while ts < utnyttelseres:
        timer_label_obj.config(text=ts)
        ts+=1
        timer_label_obj.place(x=100, y=150)
        time.sleep(0.01)
        if ts == utnyttelseres:
            timer_label_obj.config(text=utnyttelseres)
            timer_label_obj.destroy()

def countup(t):
    timer = Label(betongtrykk)
    th = threading.Thread(target=cd,args=[timer,t])
    th.start()

submitCountdown = Button(betongtrykk, padx=5, pady=5, text="Submit", font=("Arial", 20), command = lambda:countup(0))
submitCountdown.place(x= 100, y=100)

betongtrykk.mainloop()

替代解决方案:

如果您希望在下一个倒计时开始之前删除倒计时标签,您可以将 timer 设为全局变量并在创建新的倒计时标签之前对其使用 .destroy() 方法countup.

def cd(timer_label_obj,ts):
    while ts < utnyttelseres:
        timer_label_obj.config(text=ts)
        ts+=1
        timer_label_obj.place(x=100, y=150)
        time.sleep(0.01)
        if ts == utnyttelseres:
            timer_label_obj.config(text=utnyttelseres)

def countup(t):
    global timer
    try:
        timer.destroy()
    except NameError:
        pass
    
    timer = Label(betongtrykk)
    th = threading.Thread(target=cd,args=[timer,t])
    th.start()