tkinter destroy 函数不释放删除的小部件 space?

tkinter destroy function does not release the removed widget space?

我尝试用tkinter设计了一个简单的功能:

当用户点击“添加行”按钮时添加一行用于文本输入

当用户点击冗余行的“删除行”按钮时删除最后一行。

但是,当我删除一些行后添加新行时,被删除行占据的那些space将被跳过而不是重叠。

下面是我实现的功能

import tkinter as tk

#------------------------------------
def addrow():
    frame = tk.Frame(root)
    frame.pack()

    lab1 = tk.Label(frame, text='keyword')
    lab1.grid(row=0, column=0)

    ent1 = tk.Entry(frame,justify='center')
    ent1.grid(row=1, column=0)

    lab2 = tk.Label(frame, text='value')
    lab2.grid(row=0, column=1)

    ent2 = tk.Entry(frame,justify='center')
    ent2.grid(row=1, column=1)

    all_labels.append( (lab1, lab2) )
    all_entries.append( (ent1, ent2) )
#------------------------------------
def delrow():
    print("Delete")

    frame = tk.Frame(root)
    frame.pack()
    
    all_labels[-1][0].destroy()
    all_labels[-1][1].destroy()
    all_labels.pop(-1)


    all_entries[-1][0].destroy()
    all_entries[-1][1].destroy()
    all_entries.pop(-1)
#------------------------------------
def saveandclose():
    df_dict = {}
    for number, (ent1, ent2) in enumerate(all_entries):
        print(number, ent1.get(), ent2.get())

    for (ent1, ent2) in all_entries:
        df_dict[ent1.get()] = ent2.get()
    root.destroy()
    return df_dict
#------------------------------------
all_labels = []
all_entries = []

root = tk.Tk()
root.geometry('500x300')

showButton = tk.Button(root, text='Save and close', command=saveandclose)
showButton.pack()

addboxButton = tk.Button(root, text='ADD ROW', fg="Red", command=addrow)
delboxButton = tk.Button(root, text='DELETE ROW', fg="Red", command=delrow)
addboxButton.pack()
delboxButton.pack()
root.mainloop()

#------------------------------------

Issue Demonstration

感谢任何反馈,谢谢

因为放置这些标签和条目的框架没有被破坏,仍然占据着space。

您还需要存储这些帧并销毁最后一帧:

def addrow():
    frame = tk.Frame(root)
    frame.pack()

    lab1 = tk.Label(frame, text='keyword')
    lab1.grid(row=0, column=0)

    ent1 = tk.Entry(frame,justify='center')
    ent1.grid(row=1, column=0)

    lab2 = tk.Label(frame, text='value')
    lab2.grid(row=0, column=1)

    ent2 = tk.Entry(frame,justify='center')
    ent2.grid(row=1, column=1)

    all_frames.append(frame)
    #all_labels.append( (lab1, lab2) )
    all_entries.append( (ent1, ent2) )
#------------------------------------
def delrow():
    print("Delete")

    # remove frame from list and destroy it
    all_frames.pop().destroy()

    #all_labels.pop()
    all_entries.pop()
#------------------------------------
...
all_frames = []
#all_labels = []  # it is not necessary at all
all_entries = []
...