Python中带有lambda的tkinter按钮命令

Posted

技术标签:

【中文标题】Python中带有lambda的tkinter按钮命令【英文标题】:tkinter button commands with lambda in Python 【发布时间】:2013-04-19 21:58:05 【问题描述】:

我尝试搜索解决方案,但找不到可行的解决方案。我有一个 tkinter 按钮的 2d 列表,我想在鼠标单击时更改它们的文本。我试过这样做:

def create_board(number):
    print(number)
    for i in range (0,number):
        buttonList.append([])
        for j in range(0,number):
            print(i,j)
            buttonList[i].append(Button(root, text = " ", command = lambda: update_binary_text(i,j)))
            buttonList[i][j].pack()

然后当它被点击时它会调用这个函数:

def update_binary_text(first,second):
    print(first,second)
    buttonList[first][second]["text"] = "1"

当我单击一个按钮时,它什么也不做,我让程序显示被单击按钮的索引,它们都显示 4、4(这是当变量 number=5 时)这个? 这是我第一次尝试 Python 的课程。

谢谢

【问题讨论】:

这能回答你的问题吗? Python Lambda in a loop 【参考方案1】:

您可以通过为 ij 创建闭包来解决这个问题:

command = lambda i=i, j=j: update_binary_text(i, j)

您还可以使用对按钮对象本身的引用来创建回调工厂:

def callback_factory(button):
    return lambda: button["text"] = "1"

然后在你的初始化代码中:

for j in range(0, number):
    new_button = Button(root, text=" ")
    new_button.configure(command=callback_factory(new_button))
    new_button.pack()
    buttonList.append(new_button)

【讨论】:

哇!你的解决方案奏效了!谢谢你,先生!现在我坚持你发布的第一个例子。但我肯定也会研究你展示的第二个例子。再次感谢!【参考方案2】:

每当我需要一组类似的小部件时,我发现将它们封装在一个对象中并将绑定方法作为回调传递而不是使用 lambda 玩花样是最简单的。因此,不要使用带有小部件的 buttonList[] 之类的列表,而是创建一个对象:

class MyButton(object):
    def __init__(self, i, j):
        self.i = i
        self.j = j
        self.button = Button(..., command = self.callback)

    def callback(self):
        . . .

现在,您有了这些对象的列表buttonList[],而不是小部件本身。要更新文本,要么为此提供一个方法,要么直接访问该成员:buttonList[i].button.configure(. . .) 当回调被激活时,它具有整个对象以及您在self 中可能需要的任何属性。

【讨论】:

以上是关于Python中带有lambda的tkinter按钮命令的主要内容,如果未能解决你的问题,请参考以下文章

tkinter 按钮回调中的 Lambda 函数

Tkinter lambda 函数

Tkinter Button按钮组件如何调用一个可以传入参数的函数

如何在类python tkinter OOP中使用命令更改按钮的背景?

Tkinter 在循环中使用 lambda 分配按钮命令

动态生成 Tkinter 按钮