我正在写一个简单的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”,无论哪个滑块我感动了。
导致这种情况的原因是什么?
答案 0 :(得分:3)
问题在于您的lambda
功能 - 它希望使用change_brightness
和k
来呼叫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
的值。