![](/img/trans.png)
[英]How should be deleted widgets that were create by a loop, in python tkinter?
[英]Python Tkinter :removing widgets that were created using a for loop
我目前正在學習如何在python上使用Tkinter庫來創建一個包含經度和緯度點的GUI並將其輸出到文件中。 基本上,我試圖使必須將正確的點線格式復制到另一個文件的過程自動化。
因此,我創建了一個“輸入和按鈕”字段,以查看生成“形狀”需要多少個長/緯度點。 使用用戶的這個整數輸入,我有一個for循環,用多個要求長/低點的小部件填充GUI。 我的工作正常,但是現在我嘗試使用一個清除按鈕,該按鈕將允許用戶清除所有這些長/緯度點,並使他們能夠用其他形狀所需的點數來填充字段。
到目前為止,我有:
def clearGrid():
coordAmount = int(pointText.get())
latLabel.grid_forget()
longLabel.grid_forget()
.....(contains code that populates the GUI)
#creating clear site Button
clearButton = Button(main_gui, text="Clear Sites!",command=clearGrid)
clearButton.grid(row=lastRow+1, column=5, pady=10)
但是,我遇到的問題是,單擊清除按鈕時,它僅清除窗口小部件的最新實例,而不是全部窗口小部件。 因此,在創建5個實例/小部件迭代的for循環中,它將僅刪除5個實例/小部件迭代。
我試圖使清除按鈕功能能夠刪除這些小部件的所有5個實例。
所以這是我如何用小部件填充GUI的簡化代碼
def generatePoints():
for x in range(0,3):
degLong_label = Label(main_gui, text="Degree:", height=2)
degLong_label.grid(row=y,column=6,sticky=E)
degLong = Entry(main_gui, width=4)
degLong.grid(row=y,column=7,sticky=W)
#minute
minLong_Label = Label(main_gui,text="Minutes:", height=2)
minLong_Label.grid(row=y,column=8,sticky=W)
minLong = Entry(main_gui,width=3)
minLong.grid(row=y,column=8,sticky=E)
#seconds
secLong_Label= Label(main_gui,text="Sec:",height=2)
secLong_Label.grid(row=y,column=9,sticky=W,padx=20)
secLong = Entry(main_gui,width=3)
secLong.grid(row=y,column=9,sticky=E,padx=20)
#direction
dirLong_Label = Label(main_gui,text="Direction:",padx=5,height=2)
dirLong_Label.grid(row=y,column=12,sticky=W)
dirLong = Entry(main_gui,width=3)
dirLong.grid(row=y,column=13)
您通常需要通過列表來保留對所有這些小部件的引用。 嘗試在循環之前初始化列表( list_of_widgets
),然后每次創建窗口小部件時,都將其附加到該列表中。 清除后,可以遍歷該小部件列表並銷毀每個小部件。 清除它們后,您可以清除列表,這樣就不會再破壞一次窗口小部件(Tkinter此時將出錯)。
def generatePoints():
list_of_widgets = [] # or take the list as a parameter
for x in range(3):
degLong_label = Label(...)
degLong_label.grid(...)
list_of_widgets.append(degLong_label)
degLong = Entry(...)
degLong.grid(...)
list_of_widgets.append(degLong)
# et al.
def clearGrid(list_of_widgets):
for widget in list_of_widgets:
widget.destroy()
請注意,如果您不打算再次顯示該特定小部件 (初始化一個新小部件不計入),則您可能實際上想破壞這些小部件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.