我正在用python tkinter制作数据库的前端。为了显示记录,我使用for循环来填写每一行。在每一行中,我试图添加一个按钮,打开该记录信息,但在每一行的按钮将打开最后一个记录。这将表明每个按钮的命令被重写为最后一个值,这也可能意味着按钮不是唯一的。我想帮助在尝试生成一个唯一的按钮为每个循环或解决方案的指令为命令被重写。
list1 = ["t1", "t2", "t3"]
dcount=0
sizel=len(list1)
for x in range(0,sizel):
button = Button(frame, text="test", command=lambda:action(frame,list1[x]))
button.grid(row=dcount,column=0)
dcount=dcount+1
任何帮助都会很感激。我确实看到了一些解决方案,他们把值放在lambda前面,但我无法让它工作。
list1 = ["t1", "t2", "t3"]
dcount=0
sizel=len(list1)
for x in range(0,sizel):
y=functools.partial(action,frame,list1[x])
button = Button(frame, text="test", command=y)
button.grid(row=dcount,column=0)
dcount=dcount+1
如果我浪费了大家的时间,我再次道歉。这是我找到的解决方案。这篇文章引发了解决方案:如何传递参数到一个按钮命令在Tkinter?下面的例子对我很有效。
import tkinter as tk
def func1():
print(1)
def func2():
print(2)
def func3():
print(3)
root = tk.Tk()
funcList = [func1, func2, func3]
buttons = []
for x in range(len(funcList)):
buttons.append(tk.Button(root, text="test", command=funcList[x]))
buttons[x].grid(row=x, column=0)
root.mainloop()
下面是代码中影响最小的最简单的更改:
button = Button(frame, text="test", command=lambda idx=x: action(frame, list1[idx]))
问题是您定义lambda
取x
,但它将取x
的当前值,即最后一个。相反,您需要指定您的参数idx
(或您喜欢的任何参数)必须取它在此特定循环迭代期间看到的x
的值。