Tkinter - 从网格中动态删除行
Tkinter - Deleting rows from a grid dynamically
我有一些代码可以读取 .csv 文件,然后使用网格显示内容并遍历 rows/columns 来打包它们,如下所示:
from tkinter import *
import csv
def createStandardTable(f,window):
global trow
global table
global w
global sizes
global record
global column
handle = csv.reader(f)
length = len(next(handle))
sizes = [0] * length
for record in handle:
for p,column in enumerate(record):
if len(column) > sizes[p]:
sizes[p] = len(column)+3
f.seek(0)
trow = 0
table = Frame(window)
for record in handle:
for w,column in enumerate(record):
print(w)
setText = StringVar()
Entry(table,textvariable=setText,width=sizes[w]+5,relief="groove",justify=LEFT, background='white').grid(column=w,row=trow,sticky=W)
setText.set(column)
trow+=1
return table
def delete_row():
l=list(table.grid_slaves(row=trow))
print(l)
for w in l:
w.grid_forget()
def new_row():
global trow
for w,column in enumerate(record):
Entry(table,textvariable="",width=sizes[w]+5,relief="groove",justify=LEFT, background='white').grid(column=w,row=trow,sticky=W)
print (trow)
trow+=1
root = Tk()
f = open("example.csv")
newButton = Button(text='new row', command=new_row)
deleteButton = Button(text='delete row', command='delete_row')
newtable = createStandardTable(f,root)
newtable.pack()
newButton.pack()
deleteButton.pack()
root.mainloop()
example.csv 看起来像这样:
ID | Name | username | password
1234| Bob | test123 | l98762
当按下 "new row" 按钮时,它会成功创建一个新行。但是,无论何时按下 "delete row" 按钮,它都不会删除最近的一行,我不明白为什么不呢?
谁能解释一下哪里出了问题?
谢谢
我无法测试它,因为你没有提供一个工作示例,但我注意到的第一件事是你增加了 trow after 你添加了行,所以最后一行是 trow - 1。因为无论如何你都需要减少它,所以在你尝试删除之前就这样做。
def delete_row():
trow -= 1
l=list(table.grid_slaves(row=trow))
for w in l:
w.grid_forget()
或者更好的是,忘记使用您自己的变量并使用 table.grid_size()
来查找要添加或删除的行。
编辑:您似乎还向按钮传递了一个字符串,而不是一个函数。将该行更改为:
deleteButton = Button(text='delete row', command=delete_row)
我有一些代码可以读取 .csv 文件,然后使用网格显示内容并遍历 rows/columns 来打包它们,如下所示:
from tkinter import *
import csv
def createStandardTable(f,window):
global trow
global table
global w
global sizes
global record
global column
handle = csv.reader(f)
length = len(next(handle))
sizes = [0] * length
for record in handle:
for p,column in enumerate(record):
if len(column) > sizes[p]:
sizes[p] = len(column)+3
f.seek(0)
trow = 0
table = Frame(window)
for record in handle:
for w,column in enumerate(record):
print(w)
setText = StringVar()
Entry(table,textvariable=setText,width=sizes[w]+5,relief="groove",justify=LEFT, background='white').grid(column=w,row=trow,sticky=W)
setText.set(column)
trow+=1
return table
def delete_row():
l=list(table.grid_slaves(row=trow))
print(l)
for w in l:
w.grid_forget()
def new_row():
global trow
for w,column in enumerate(record):
Entry(table,textvariable="",width=sizes[w]+5,relief="groove",justify=LEFT, background='white').grid(column=w,row=trow,sticky=W)
print (trow)
trow+=1
root = Tk()
f = open("example.csv")
newButton = Button(text='new row', command=new_row)
deleteButton = Button(text='delete row', command='delete_row')
newtable = createStandardTable(f,root)
newtable.pack()
newButton.pack()
deleteButton.pack()
root.mainloop()
example.csv 看起来像这样:
ID | Name | username | password
1234| Bob | test123 | l98762
当按下 "new row" 按钮时,它会成功创建一个新行。但是,无论何时按下 "delete row" 按钮,它都不会删除最近的一行,我不明白为什么不呢?
谁能解释一下哪里出了问题? 谢谢
我无法测试它,因为你没有提供一个工作示例,但我注意到的第一件事是你增加了 trow after 你添加了行,所以最后一行是 trow - 1。因为无论如何你都需要减少它,所以在你尝试删除之前就这样做。
def delete_row():
trow -= 1
l=list(table.grid_slaves(row=trow))
for w in l:
w.grid_forget()
或者更好的是,忘记使用您自己的变量并使用 table.grid_size()
来查找要添加或删除的行。
编辑:您似乎还向按钮传递了一个字符串,而不是一个函数。将该行更改为:
deleteButton = Button(text='delete row', command=delete_row)