我嘗試使用 tkinter 設計一個簡單的功能:
當用戶單擊“添加行”按鈕時,為文本輸入添加一行
當用戶為冗余行單擊“洗掉行”按鈕時,洗掉最后一行。
但是,當我洗掉一些行后添加新行時,那些被洗掉行占用的空間將被跳過而不是重疊。
這是我實作的功能
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()
#------------------------------------
問題演示
感謝任何反饋,謝謝
uj5u.com熱心網友回復:
這是因為保存這些標簽和條目的框架沒有被破壞并且仍然占據空間。
您還需要存盤這些幀并銷毀最后一幀:
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 = []
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/441034.html
