在Tkinter中删除选定行

-1 投票
1 回答
88 浏览
提问于 2025-04-14 17:27

我该如何通过按一个按钮来删除选中的行并添加一行新行到一个表格中呢?

我已经创建了两个按钮,并为它们设置了相应的功能:

from tkinter import *
import tkinter as tk

def get_val(row, col):
    table[row][col] = entry_vars[row][col].get()

def delete_row(row, col):    #   how to delete selected row   need code 
    return

def add_row(row, col):  #   how to Add New  row need code 
          return  
    
root = tk.Tk()
height = 10
width = 10

table = [['' for i in range(height)] for j in range(width)]

entry_vars = []

for i in range(height):
    row_vars = []
    for j in range(width):
        vary = tk.StringVar()
        var.set(table[i][j])
        entry = tk.Entry(root, textvariable=var)
        entry.grid(row=i, column=j)
        entry.bind('<FocusOut>', lambda event, row=i, col=j: get_val(row, col))
        row_vars.append(var)
    entry_vars.append(row_vars)
        
    b = Button(root, text="Add New Row", command= lambda row=i, col=j: add_row(row, col), width=10)
    b.grid(row=20, column=0)
     
    b1 = Button(root, text="delete Row", command= lambda row=i, col=j: delete_row(row, col), width=10)
    b1.grid(row=20, column=1)
    
root.mainloop()

1 个回答

0

我把你的代码重新写了一遍,补上了缺少的功能,并根据需要做了一些修改。希望你觉得这对你有帮助。

from tkinter import *
import tkinter as tk


def get_val(row, col):
    values[row][col] = entry_vars[row][col].get()


def delete_row():
    global height
    height -= 1

    # get all cells in a row and "forgets" them
    for cell in root.grid_slaves(row=height):
        cell.grid_forget()
    # delete the row's values and entry variables
    values.pop()
    entry_vars.pop()


def add_row():
    # the height is not a constant since rows could be added, and it is the best variable to indicate a new row's id
    global height
    row = height
    height += 1

    values.append(["" for _ in range(initial_width)])
    # The code you wrote to make initial rows
    row_vars = []
    for j in range(initial_width):
        var = tk.StringVar()
        # removed the var.set since there is no initial values now
        entry = tk.Entry(root, textvariable=var)
        entry.grid(row=row, column=j)
        entry.bind('<FocusOut>', lambda event, r=row, c=j: get_val(r, c))
        row_vars.append(var)
    entry_vars.append(row_vars)


root = tk.Tk()
height = 0

# changed to initial for clarity
initial_height = 10  
initial_width = 10  

# changed the table variable to be dynamic and renamed it 
values = []
# no change after here
entry_vars = []

for i in range(initial_height):
    add_row()

b = Button(root, text="Add New Row", command=add_row, width=10)
b.grid(row=20, column=0)
b1 = Button(root, text="delete Row", command=delete_row, width=10)
b1.grid(row=20, column=1)

root.mainloop()

撰写回答