为什么我无法删除此标签 (Tkinter)

Mih*_*kel 1 python label tkinter destroy

我只是在玩弄和测试 python 中的东西。对于更大项目的概念验证代码的一部分,我需要创建然后删除标签。不幸的是,在我创建标签然后尝试将其删除后,当我尝试.destory()使用标签时出现此错误:

AttributeError: 'NoneType' object has no attribute 'destroy'

我听说如果你的标签中没有任何内容,你会得到这个错误,所以它是“无”,但我的有文字。这是代码:

from tkinter import*
import random
import time

root = Tk()
root.geometry("800x500")
root.title("amazing")

def one():
    label1 = Label(root, text="one", font=("Comic Sans MS", 30),  fg="purple").pack()
    time.sleep(2)
    label1.destroy()

def two():
    label2 = Label(root, text="two", font=("Comic Sans MS", 30),  fg="purple").pack()
    time.sleep(2)
    label2.destroy()

def doit():
    rchoice = [two, one]
    selected = random.choice(rchoice)
    return selected()

Button = Button(root, text="Button", width=15, height=3, font=("Comic Sans MS", 20), fg="blue", bg="lightgreen", command=doit).pack(pady=50)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

Mir*_*j50 5

您的代码有几个问题。

  1. 如果您尝试打印标签的值,您会发现它实际上是None。那是因为您pack()刚刚在定义小部件并pack()返回 None后使用了该方法。所以,你需要把它们分开。

  2. 避免sleep()在 tkinter 中使用。它会冻结你的主循环。这样做的方法是使用after().

这是工作代码。

from tkinter import *
import random

root = Tk()
root.geometry("800x500")
root.title("amazing")

def one():
    label1 = Label(root, text="one", font=("Comic Sans MS", 30),  fg="purple")
    label1.pack()
    label1.after(2000, label1.destroy)

def two():
    label2 = Label(root, text="two", font=("Comic Sans MS", 30),  fg="purple")
    label2.pack()
    label2.after(2000, label2.destroy)

def doit():
    rchoice = [two, one]
    selected = random.choice(rchoice)
    return selected()

Button(root, text="Button", width=15, height=3, font=("Comic Sans MS", 20), fg="blue", bg="lightgreen", command=doit).pack(pady=50)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)