我正在TKinter中创建一个键盘。按下按钮应该只打印出该按钮的文本。由于某种原因,每个按钮都会打印出ctrl,这是最后创建的按钮。如何更改它以便实际打印出每个按钮的相应文本?
def press(key):
print(key)
def createWidgets(self):
for tup in layout.layout:
for key, value in tup:
button = Button(self, text=key, command=lambda: self.press(key))
self.kboard_buttons.append(button)
button.pack(side="left")
答案 0 :(得分:2)
当函数被称为时,lambda
函数内的表达式被计算,而不是在定义它时。这意味着key
in:
command=lambda: self.press(key)
将始终引用for循环中key
所持的最后一个值。
您可以通过简单地将key
的值作为lambda
的默认参数来解决此问题:
command=lambda key=key: self.press(key)
因为在定义函数时会计算默认参数,所以这将确保key
内的lambda
引用for循环内的key
的当前值,而不是最后的价值。