为什么修改 'label_x' 后 destroy() 不起作用?

Why destroy() doesn't work after 'label_x' is modified?

如果我在启动这个小程序后单击按钮“xxx”,它会破坏 window 除了按钮“greet me”之外的所有小部件'...应该... 但是,如果我在黄色的输入字段中写了一些东西,然后单击“问候我,然后在“xxx[上单击” =20=]'...然后由于某种原因修改后的 'label_x' 将不再被删除...另外如果我在输入框中多次写一些名字然后单击'问候我' 它只是写在 destroying/deleting 的前一个标签上。 为什么会这样,如何解决?

from tkinter import *
root = Tk()

# Creating an entry box
entry_box = Entry(root, width=10, relief="solid", bg="yellow" )
entry_box.grid(column=0, row=0)
entry_box.insert(3, "type name")

# Creating label widgets
label_x = Label(root, text="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
label_x.grid(column=0, row=2)
label_minus = Label(root, text="------------------------------")
label_minus.grid(column=0, row=3)

def greeter():
    label_x = Label(root, text="Welcome " + entry_box.get())
    label_x.grid(column=0, row=2)

# Creating greeter button
myButton = Button(root, text="greet me", command = lambda: [label_x.destroy(), greeter()])
myButton.grid(column=0, row=1)

x = Button(root, text="xxx", command = lambda: [label_x.destroy(), entry_box.destroy(), label_minus.destroy()])
x.grid(column=0, row=4)

root.mainloop()

每次调用 greeter() 函数时,您都在创建 label_x 的新实例。不同于全局 label_x 变量的 label_x。

一个快速修复方法是在 greeter() 函数中将 label_x 声明为全局变量。像这样:

def greeter():
    global label_x
    label_x = Label(root, text="Welcome " + entry_box.get())
    label_x.grid(column=0, row=2)

这可能不是最好的解决方案,但应该可行。