Python Tkinter,使用循环设置按钮回调函数

use*_*924 3 python tkinter python-2.7

我正在编写一个显示按钮网格的程序,当按下按钮时,我希望它将网格中按钮的位置("行列")打印到控制台.这就是我所拥有的

import Tkinter as tk

class board(tk.Tk):
    def __init__(self, parent=None):
        tk.Tk.__init__(self,parent)
        self.rows = 5
        self.columns = 5
        self.init_board()

    def init_board(self):
        for i in range(self.rows):
            for j in range(self.columns):
                cmd = lambda: self.button_callback(i,j)
                b = tk.Button(self, text=str("  "), command=cmd)
                b.grid(row=i, column=j)

    def button_callback(self, row, col):
        print(str(row) + " " + str(col))


if __name__ == '__main__':
    board().mainloop()
Run Code Online (Sandbox Code Playgroud)

问题是,当我点击任何按钮时,我会打印出"4 4",这是循环中实例化的最后一个按钮的位置.我不知道为什么会这样,请帮忙!

fal*_*tru 6

在使用lambda,, 创建的函数中i,j指的是init_board函数中的变量,在for循环结束后设置为4,4 .

您可以使用默认参数解决此问题.


替换以下行:

cmd = lambda: self.button_callback(i,j)
Run Code Online (Sandbox Code Playgroud)

有:

cmd = lambda i=i, j=j: self.button_callback(i,j)
Run Code Online (Sandbox Code Playgroud)