这里我有一个使用Tkinter
from Tkinter import *
def draw(i,j):
button[(i,j)]['text'] = 'X'
if __name__ == '__main__':
root = Tk()
root.title('Number Recognation')
button = {}
for i in range(2):
for j in range(2):
button[(i,j)] = Button(width = 3,command = lambda: draw(i,j))
button[(i,j)].grid(row = i,column = j)
root.mainloop()
我想制作一个小程序,其中有四个空白按钮,并且您按下其中一个按钮,它将其文本更改为“X”。因此,当我使用for
循环编写此程序时,它无法正常工作,单击它会更改此按钮,该按钮位于第二行和第二列。如果我写的没有for
循环
button[(0,0)] = Button(width = 3,command = lambda: draw(0,0))
button[(0,0)].grid(row = 0,column = 0)
button[(0,1)] = Button(width = 3,command = lambda: draw(0,1))
button[(0,1)].grid(row = 0,column = 1)
button[(1,0)] = Button(width = 3,command = lambda: draw(1,0))
button[(1,0)].grid(row = 1,column = 0)
button[(1,1)] = Button(width = 3,command = lambda: draw(1,1))
button[(1,1)].grid(row = 1,column = 1)
这不是问题。
我真的想用于循环,因为我在这里会有很多按钮。
答案 0 :(得分:3)
i
,j
在调用回调时绑定,而不是在创建回调时绑定。您可以使用默认参数来避免后期绑定问题。
for i in range(2):
for j in range(2):
button[(i,j)] = Button(width = 3,command = lambda i=i, j=j: draw(i,j)) # <---
button[(i,j)].grid(row = i,column = j)