gpt4 book ai didi

Python Tkinter :removing widgets that were created using a for loop

转载 作者:行者123 更新时间:2023-12-01 03:52:46 24 4
gpt4 key购买 nike

我目前正在学习如何在 python 上使用 Tkinter 库来创建一个 GUI,该 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()

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

关于Python Tkinter :removing widgets that were created using a for loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37977885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com