我正在使用 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"
為什么會發生此錯誤,我該如何解決?提前致謝!
uj5u.com熱心網友回復:
.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()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/482706.html
