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

3
我正在使用Tkinter尝试一个测试应用程序。我已经使用网格布局管理器创建了一个表格,如下所示。有两个按钮 - 添加行删除行添加行按预期工作。我该如何删除选定的行?我的想法是为每一行提供一个复选框,如下所示。然后可以删除每个选定的行。但是我不知道具体该怎么做,而且不确定是否可行。

在这种情况下,是否有更好的方法来删除行?请提供解决方案。

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个回答

3
为了删除小部件,您需要在创建它们时保留对它们的引用。
在下面的代码中,我创建了一个名为rows的列表,其中每个行都有一个子列表items。每一行都包含一个对checkbutton和所有条目的引用。
当按下“删除行”按钮时,该函数循环遍历列表,并销毁激活了checkbutton的行中的所有条目,然后从列表中删除该条目。
注意:
  • 我将var作为checkbutton的属性,这样我们就可以访问它以查看它是否被选中-请参见this问题。

  • 您为每行创建了五个checkbutton;我已将其从循环中取出。

  • 反向迭代行列表, 这样当一个项目被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()

太好了!非常感谢 :) - Jio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接