用不同的命令创建多个Tkinter按钮,但外部变量

2024-05-23 20:31:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在一个for循环中,在Tkinter中创建多个按钮。问题是我用.iterrows遍历一个数据帧(行中的值是我创建的Tkinter gadets的内容),这意味着,我没有“I”,只有行和索引。在

问题是,当我创建按钮并用lambda I给它们不同的命令时:I=SomeFunction(somevariable),这里我必须使用一个变量而不是“I”。结果是这些命令都在末尾引用这个“somevariable”的最后一个值,而不是像创建按钮时那样引用它的值。在

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”的最后一个值。在

你知道怎么做吗??在


Tags: 数据lambda命令内容fortkinterwindow按钮
2条回答

免责声明:这个答案是“老”的,因为我试图解决它-但没有,直到Nae发布了重复。要进一步解释发生了什么:

问题是,当你按下按钮时,你的lambda会被计算出来。 {cd1>的值将在此时打印。您可以通过使用Nae' answer在创建lambda时为lambda提供一个somevariable的快照来修复somevariable的当前值,为了使这一点更清楚,我将其重新格式化为:

command= lambda s=somevariable: printout(s)) 

为了明确lambda使用s,它在此时取somevariable的值,当调用时,将打印s。在

完整示例:

^{pr2}$

pressed buttons 1-4 in row

替换:

command= lambda i=i: printout(somevariable))

有:

^{pr2}$

相关问题 更多 >