为什么我无法删除此标签 (Tkinter)
Why Am I Unable To Remove This Label (Tkinter)
我只是在闲逛和测试 python 中的东西。对于一个更大项目的概念验证代码的一部分,我需要创建然后删除标签。
不幸的是,在我创建标签然后尝试删除它之后,当我尝试 .destory()
标签时出现此错误:
AttributeError: 'NoneType' object has no attribute 'destroy'
我听说如果您的标签中没有任何内容,您可能会遇到此错误,所以它是 "None",但我的标签有文字。这是代码:
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()
你的代码有几个问题。
如果您尝试打印标签的值,您会发现它实际上是 None
。那是因为你在定义了widget 和pack()
returns None 之后就使用了pack()
方法。所以,你需要把它们分开。
避免在 tkinter 中使用 sleep()
。它会冻结你的主循环。方法是使用 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()
我只是在闲逛和测试 python 中的东西。对于一个更大项目的概念验证代码的一部分,我需要创建然后删除标签。
不幸的是,在我创建标签然后尝试删除它之后,当我尝试 .destory()
标签时出现此错误:
AttributeError: 'NoneType' object has no attribute 'destroy'
我听说如果您的标签中没有任何内容,您可能会遇到此错误,所以它是 "None",但我的标签有文字。这是代码:
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()
你的代码有几个问题。
如果您尝试打印标签的值,您会发现它实际上是
None
。那是因为你在定义了widget 和pack()
returns None 之后就使用了pack()
方法。所以,你需要把它们分开。避免在 tkinter 中使用
sleep()
。它会冻结你的主循环。方法是使用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()