将变量传递给python中的函数

时间:2014-06-09 19:30:30

标签: python variables tkinter tk

我正在写一个简单的gui来改变显示器的亮度,但是我遇到了问题。

def start_ui(self):
    root = Tk()
    root.wm_title("Set brightness")

    col = 0
    for k, v in self.monitors.iteritems():
        print k
        Scale(root, variable = DoubleVar(), command = lambda(r): self.change_brightness(k, r)).grid(row=0, column=col)
        labelVar = StringVar()
        label = Label(root, textvariable=labelVar).grid(row=1, column=col)
        labelVar.set(k)
        col += 1

    root.mainloop()

这是我启动UI的地方,我的self.monitors字典如下所示: {'LVDS1':'1.0','VGA1':'1.0'}。

循环的输出是“LVDS1,VGA1”,但是,当我移动滑块并调用回调时,总是传递k的最后一个值,在这种情况下为“VGA1”,无论哪个滑块我感动了。

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:3)

问题在于您的lambda功能 - 它希望使用change_brightnessk来呼叫r,但k在调用之前不会被解析。因此,它在调用函数时使用全局变量k保存的值。如果你在for循环之外有一行表示k = 'SomeNonsenseValue',那么这就是传递给lambda函数的值。

请改为尝试:

for k, v in self.monitors.iteritems():
    def createLambda(k):
        return lambda(r): self.change_brightness(k, r)
    Scale(root, variable = DoubleVar(), command = createLambda(k)).grid(row=0, column=col)

这会创建一个闭包,允许lambda函数在创建函数时保留k的值。