如何删除Tkinter网格布局中的整行

时间:2016-09-19 12:20:24

标签: python-2.7 tkinter

我正在尝试使用Tkinter进行测试。我使用网格布局管理器创建了一个表,如下所示。有两个按钮 - 添加行删除行添加行按预期工作。我如何删除选定的行。我的想法是为每行提供一个Checkbutton,如下所示。并且可以删除每个选定的行。但我不知道如何准确地做到这一点,如果可能的话。

在这种情况下,有更好的方法可以删除行吗?请提出解决方案。

enter image description here

代码:

        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来创建表。

1 个答案:

答案 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()