簡體   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