为了删除小部件,您需要在创建它们时保留对它们的引用。
在下面的代码中,我创建了一个列表rows
其中有一个子列表items
对于每一行。每行包含对复选按钮和所有条目的引用。
When Delete Row
按下后,该函数循环遍历列表并销毁激活了复选按钮的行中的所有项目,然后从列表中删除该条目。
Notes:
我已经做了var
checkbutton 的属性,以便我们可以访问它以查看它是否已被选中 - 请参阅this https://stackoverflow.com/questions/4236910/getting-tkinter-check-box-state问题。
您为每行创建了五次检查按钮;我已经把它从循环中取出来了。
I 向后迭代行列表 https://stackoverflow.com/a/529427/3714940,这样当一个项目是pop
-ed,它仅更改已处理的行的索引。这意味着您可以一次删除多行。
from Tkinter import *
import ttk
from ttk import *
i=2
rows = []
def add_row():
global i
i=i+1
items = []
var = IntVar()
c = Checkbutton(root, variable = var)
c.val = var
items.append(c)
c.grid(row = i, column = 0)
for j in range(1,5): #Columns
b = Entry(root)
items.append(b)
b.grid(row=i, column=j)
rows.append(items)
def delete_row():
for rowno, row in reversed(list(enumerate(rows))):
if row[0].val.get() == 1:
for i in row:
i.destroy()
rows.pop(rowno)
root = Tk()
bt = ttk.Button(root , text = 'Add Row', command = add_row)
bt.grid(row =0, column=0)
dl = ttk.Button(root , text = 'Delete Row', command = delete_row)
dl.grid(row =0, column=1)
v0 = StringVar()
e0 = Entry(root, textvariable = v0, state = 'readonly')
v0.set('Select')
e0.grid(row = 1, column = 0 )
v1 = StringVar()
e1 = Entry(root, textvariable = v1, state = 'readonly')
v1.set('Col1')
e1.grid(row = 1, column = 1 )
v2 = StringVar()
e2 = Entry(root, textvariable = v2, state = 'readonly')
v2.set('Col2')
e2.grid(row = 1, column = 2)
v3 = StringVar()
e3 = Entry(root, textvariable = v3, state = 'readonly')
v3.set('Col3')
e3.grid(row = 1, column = 3 )
v4 = StringVar()
e4 = Entry(root, textvariable = v4, state = 'readonly')
v4.set('Col4')
e4.grid(row = 1, column = 4 )
mainloop()