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 = []
...
我尝试用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 = []
...