我正在尝试使用Tkinter进行测试。我使用网格布局管理器创建了一个表,如下所示。有两个按钮 - 添加行和删除行。 添加行按预期工作。我如何删除选定的行。我的想法是为每行提供一个Checkbutton,如下所示。并且可以删除每个选定的行。但我不知道如何准确地做到这一点,如果可能的话。
在这种情况下,有更好的方法可以删除行吗?请提出解决方案。
代码:
from Tkinter import *
import ttk
from ttk import *
i =2
def add_row():
global i
var = IntVar()
c = Checkbutton(root, variable = var)
c.grid(row = i, column = 0)
for j in range(1,5): #Columns
b = Entry(root)
b.grid(row=i, column=j)
i =i+1
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')
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()
注意:我不想使用tktable或treeview来创建表。
答案 0 :(得分:2)
为了删除小部件,您需要在创建小部件时保留对它们的引用。
在下面的代码中,我创建了一个列表rows
,每行有一个子列表items
。每行包含对checkbutton和所有条目的引用。
当按下Delete Row
时,该函数循环遍历列表并销毁激活了检查按钮的行中的所有项目,然后从列表中删除该条目。
注意:
我已将var
设为检查按钮的属性,以便我们可以访问它以查看是否已检查过 - 请参阅this问题。
您为每行创建了五次检查按钮;我把它从循环中取出来了。
我iterate through the list of rows backwards,因此当项目为pop
时,它只会更改已处理的行的索引。这意味着您可以一次删除多行。
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()