簡體   English   中英

Python Tkinter:刪除使用for循環創建的小部件

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM