首页 文章

Python Tkinter:删除使用for循环创建的小部件

提问于
浏览
1

我目前正在学习如何在python上使用Tkinter库来创建一个GUI,它接受经度和纬度点并将其输出到文件中 . 基本上我正在尝试自动化必须将正确格式的点行格式复制到另一个文件的过程 .

所以我创建了一个Entry和button字段来查看生成'shape'需要多少个long / lat点 . 使用来自用户的这个整数输入,我有一个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)

但是,我遇到的问题是,当单击clear按钮时,它只清除小部件的最新实例而不是所有小部件 . 因此,在创建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)

1 回答

  • 2

    您需要保持对所有这些小部件的引用,通常是通过列表 . 尝试在循环之前初始化列表( 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()
    

    请注意,如果您不打算再次显示该特定窗口小部件(初始化新窗口小部件不计算在内),您可能希望实际销毁窗口小部件 .

相关问题