我想在for循环中在Tkinter中创建多个按钮。问题是我在迭代数据框(行中的值是我创建的Tkinter学员的内容).iterrows,这意味着,我没有" i" ,只有行和索引。
问题是,当我创建按钮并使用lambda i给它们不同的命令时:i = SomeFunction(somevariable),这里我必须使用除" i&#34以外的变量;。结果是命令都在末尾引用了这个"的一些变量"而不是像创建按钮那样的价值。
import tkinter
def printout(somevariable):
print(somevariable)
window = tkinter.Tk()
i = 0
somevariable = 0
for index, rows in enumerate(["a","b","c","d"]):
b = tkinter.Button(window,
text=rows,
command= lambda i=i: printout(somevariable))
b.pack()
somevariable = somevariable + 1
window.mainloop()
并且所有按钮都包含作为命令的最后一个值" somevariable"。
知道如何使这项工作吗?
答案 0 :(得分:0)
免责声明:这个答案比Naes更“老”,因为我试图解决它 - 但是没有直到Nae发布了这个骗局。为了解释进一步发生的事情:
问题是,按下按钮时会评估你的lambda。
它会在此时打印somevariable
的值。通过使用Nae' answer创建lambda,为lambda提供somevariable
的快照,可以修复当前的somevariable
值 - 使其更清晰我将其重新表述为:
command= lambda s=somevariable: printout(s))
明确表示lambda使用的s
此时取somevariable
的值,并且在调用时会打印s
。
完整示例:
import tkinter
def printout(somevariable):
print(somevariable)
window = tkinter.Tk()
somevariable = 0
for index, rows in enumerate(["a","b","c","d"]):
b = tkinter.Button(window,
text=rows,
command= lambda s=somevariable: printout(s))
b.pack()
somevariable = somevariable + 1
window.mainloop()
答案 1 :(得分:0)
替换:
command= lambda i=i: printout(somevariable))
使用:
command= lambda somevariable=somevariable: printout(somevariable))