在Python Tkinter中,如何在循环结构中使用Tkinter命令按钮传递参数



我正在用Tkinter学习Python的GUI。

我想创建一个有很多按钮的GUI,每个按钮都有自己的名称和类似的功能(只是参数不同(。

这是我的代码:

from tkinter import *
ALPHABET = ["1", "2", "3"]
class GUI():
def __init__(self):
self.__mainw = Tk()
self.letter_list = []
# I want that every button have own name and command function parameter
for letter in ALPHABET:
self.letter_list.append(Button(self.__mainw, text=letter, command= lambda : self.letter_btm(letter)))
for letter_btm in self.letter_list:
letter_btm.pack()
self.__mainw.mainloop()
def letter_btm(self, letter):
print(letter)
def main():
GUI()
if __name__ == "__main__":
main()

这就是结果。

在此处输入图像描述

每个按钮都打印相同的字母。我知道结果可能是变量引用,但我如何才能得到预期的结果?

按钮1,打印1

按钮2,打印2

按钮3,打印3

我不知道为什么,但这种奇怪的语法似乎有效。与在定义lambda时存储letter的当前值有关,而不是等待稍后查找letter的值。

from tkinter import *
ALPHABET = ["1", "2", "3"]

class GUI:
def __init__(self):
self.__mainw = Tk()
self.letter_list = []
# I want that every button have own name and command function parameter
for letter in ALPHABET:
temp_func = lambda letter=letter: self.letter_btm(letter)
self.letter_list.append(Button(self.__mainw, text=letter, command=temp_func))
print(self.letter_list)
for letter_btm in self.letter_list:
letter_btm.pack()
self.__mainw.mainloop()
def letter_btm(self, letter):
print(letter)

def main():
GUI()

if __name__ == "__main__":
main()

最新更新