为什么在 Tkinter 中尝试将标签小部件添加到屏幕时出现 "bad window path name" 错误?

Why am I getting a "bad window path name" error when trying to add a label widget to the screen in Tkinter?

我正在使用 Tkinter 创建一个家庭作业计划程序,我 运行 在尝试向屏幕添加错误标签以向用户显示他们可能输入了重复的作业时遇到了问题.这是标签的构造函数(entFrame 是我放置用户条目的地方):

duplicateLabel = Label(entFrame, text="Warning: the entered assignment is a duplicate!", bg=bgColor, font=regularFont)

当用户提交作业时,函数 运行s 会创建一个新的作业对象。在那个函数中,我调用了一个赋值方法来检查它是否重复。在该方法中,我创建了一个 csv 文件所有行的列表,我在其中存储分配。然后,我将新分配的属性与先前分配的一些存储属性进行核对。如果条件为真,我会在屏幕上添加警告标签。否则,我会尝试销毁标签以将其从屏幕上移除,以消除旧作业中的先前警告。

    def checkDuplicates(self):
        contents = []
        file = open("homeworkAssets/assignmentsFile", "r")
        for content in csv.reader(file):
            contents.append(content)
        file.close()
        for assignment in contents:
            if self.course == assignment[1] and self.dueDate == assignment[2] and self.details == assignment[3]:
                duplicateLabel.grid(row=0, column=0, columnspan=2)
            else:
                duplicateLabel.destroy()

我的第一个想法是 .destroy() 方法正在删除 Label 对象,尽管当我在最后一行之后添加打印语句时,控制台显示:.!labelframe.!labelframe.!label6 我认为这意味着它没有' t被删除了。当我 运行 带有空 csv 文件的程序添加一个作业,然后添加一个重复的作业时,我收到此错误消息(抱歉格式错误,我不知道如何正确执行) :

File "/Users/max/Desktop/Coding/Python/Misc./homeworkPlannerRevised.py", line 212, in checkDuplicates duplicateLabel.grid(row=0, column=0, columnspan=2) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 2493, in grid_configure self.tk.call( _tkinter.TclError: bad window path name ".!labelframe.!labelframe.!label6"

为什么会出现此错误,我该如何解决?提前致谢!

.destroy() 从 window(和内存)中删除小部件,但不会从变量中删除路径。
print(duplicateLabel) 显示对象的路径,即使它已被销毁。

你 运行 destroy() 在循环中 - 所以一个循环可以破坏标签,下一个循环可能会再次尝试破坏它 - 这会产生问题。

您可以在销毁后将 None 赋值给变量,并在销毁前检查 None

if duplicateLabel is not None:
    duplicateLabel.destroy()
    duplicateLabel = None

但是如果你销毁了对象,那么之后你必须重新创建它

if duplicateLabel is None:
   duplicateLabel = Label(...)

但坦率地说,您不需要 destroy()grid_forget() 可以在不破坏的情况下隐藏小部件。

if self.course == assignment[1] and self.dueDate == assignment[2] and self.details == assignment[3]:
    duplicateLabel.grid(row=0, column=0, columnspan=2)
else:
    duplicateLabel.grid_forget()