动态生成Tkinter按钮

rik*_*kit 3 python user-interface tkinter button

我想生成n个不同的Tkinter按钮.我有这个代码:

import Tkinter as tk

for i in range(boardWidth):
    newButton = tk.Button(root, text=str(i+1), 
        command=lambda: Board.playColumn(i+1, Board.getCurrentPlayer()))
    Board.boardButtons.append(newButton)
Run Code Online (Sandbox Code Playgroud)

如果boardWidth是5,虽然我得到标记为1-5的按钮,但是当它们单击时它们都会执行Board.playColumn(5,Board.getCurrentPlayer()).

我需要第一个按钮来执行Board.playColumn(1,Board.getCurrentPlayer()),第二个按钮来执行Board.playColumn(2,Board.getCurrentPlayer())等等.

谢谢你的帮助!

mar*_*eau 11

我认为问题是在循环结束后lambda正在拾取最终值.这应该解决(未经测试):ifor

import Tkinter as tk

for i in range(boardWidth):
    newButton = tk.Button(root, text=str(i+1),
        command=lambda j=i+1: Board.playColumn(j, Board.getCurrentPlayer()))
    Board.boardButtons.append(newButton)
Run Code Online (Sandbox Code Playgroud)

更新

顺便说一句,这是通过向lambda函数添加一个参数来实现的,该参数的默认值i是根据在循环中创建每个函数时的值计算的,而不是i在稍后执行其中的表达式时通过闭包返回最终值.