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

时间:2018-03-03 09:51:04

标签: python python-2.7 loops button tkinter

我想在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"。

知道如何使这项工作吗?

2 个答案:

答案 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()

pressed buttons 1-4 in row

答案 1 :(得分:0)

替换:

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

使用:

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