2016-09-19 31 views
0

我正在嘗試Tkinter的測試應用程序。我使用網格佈局管理器創建了一個表格,如下所示。有兩個按鈕 - 添加行刪除行添加行按預期工作。我如何去刪除選定的行。我的想法是爲每行提供一個Checkbutton,如下所示。並且每個選定的行都可以被刪除。但我不知道如何準確地完成它,如果可能的話。如何刪除Tkinter網格佈局中的整行

在這種情況下是否有更好的方法來刪除行?請提出解決方案。

enter image description here

CODE:

 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或樹視圖創建表。

回答

2

爲了刪除小部件,您需要在創建它們時保留對它們的引用。

在下面的代碼中,我創建了一個列表rows,其中每行有一個子列表items。每行包含對checkbutton和所有條目的引用。

當按下Delete Row時,函數在列表中循環並銷燬激活了檢查按鈕的行中的所有項目,然後從列表中刪除條目。

注:

  • 我已經var的checkbutton的屬性,這樣我們就可以訪問它,看它是否已檢查 - 見this問題。

  • 您正在爲每行創建五次checkbutton;我已經把它帶出了循環。

  • 我,所以當一個項目是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() 
+0

完美!非常感謝 :) – Jio