繁体   English   中英

为什么在 Tkinter 中尝试将标签小部件添加到屏幕时出现“错误的窗口路径名”错误?

[英]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)

当用户提交作业时,会运行一个创建新作业对象的函数。 在该函数中,我调用分配的方法来检查它是否重复。 在该方法中,我创建了一个 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我认为这意味着它没有被删除。 当我使用空的 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()从窗口(和内存)中删除小部件,但不会从变量中删除路径。
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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM